参考:
https://www.red-gate.com/simple-talk/sysadmin/powershell/powershell-data-basics-xml/
以及:
https://stackoverflow.com/a/65264118/4531180
如何打印元素及其属性的列表?
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $doc = new-object System.Xml.XmlDocument
PS /home/nicholas/powershell> $file = resolve-path('./bookstore.xml')
PS /home/nicholas/powershell> $doc.load($file)
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $doc.bookstore.book[1].author.first-name
ParserError:
Line |
1 | $doc.bookstore.book[1].author.first-name
| ~~~~~
| Unexpected token '-name' in expression or statement.
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $doc.bookstore.book[1].author
first-name last-name
---------- ---------
Margaret Atwood
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $doc.bookstore
bk book
-- ----
urn:samples {book, book, book, book}
PS /home/nicholas/powershell>
3条答案
按热度按时间wj8zmpe11#
如果您仔细观察示例输出from your own answer,您会发现,尽管显示内容 * 大多数情况下 * 是有用的,但是
author
属性的值是author
,而不是显示(假定的)first-name
和last-name
子元素值。问题是PowerShell的默认输出格式表示具有的子元素:
特别是**对于深度嵌套的元素,这会导致 * 无用的输出 。*
.OuterXml
或.InnerXml
属性**,该属性包含元素的完整XML * 文本 *,带有/不带有元素标记本身。.OuterXml
/InnerXml
值通过管道传输到一个 * 漂亮的打印 * 函数,但是这需要一些额外的工作,因为PowerShell没有直接公开此类功能。Select-Object
(或者,仅出于显示目的,使用Format-*
cmdlet,如Format-Table
)与calculated properties**配合使用。参见以下示例。
要通过
Select-Object
和计算属性获得所有<book>
元素 (包括<author>
子元素的<first-name>
和<last-name
〉子元素)的有用表示:这将生成(注意
author
属性现在如何列出名字和姓氏):要通过漂亮的XML获得所有
<book>
元素的有用表示,请通过一个辅助System.Xml.Linq.XDocument
示例:这将产生(一个打印得很漂亮的XML表示):
请注意,您可以将格式化代码 Package 在一个名为
Format-Xml
的简单(过滤器)函数中,并将其放入$PROFILE
文件中(在 * Windows PowerShell * 中,也可将Add-Type -AssemblyName System.Xml.Linq
放在该文件上方):现在格式设置就像这样简单:
deyfvvtc2#
元素名称
first-name
在PowerShell中显示为 * 属性名称 *,不能 * 不带引号 * 使用,因为-
会被解释为 * 减法运算符 *,从而导致您看到的错误。简而言之:
_
(下划线);无引号的 * 变量名 * 同上。[1]更准确地说,PowerShell允许一个标识符不加引号,如果它 * 完全 * 由以下Unicode类别之一的字符组成(在. NET中定义为枚举
System.Globalization.UnicodeCategory
;圆括号中列出的两个字母的简写可与\p{<shortCategoryName>}
一起用于正则表达式中):UppercaseLetter
(Lu
)LowercaseLetter
(Ll
)TitlecaseLetter
(Lt
)ModifierLetter
(Lm
)OtherLetter
(Lo
)DecimalDigitNumber
(Nd
)-* 第一个 * 字符除外(变量名没有此限制)_
("低条",更典型地:"下划线",唯一允许的 * 符号 *).foo
)@{ foo = ... }
)$foo
)不遵守上述规则的标识符必须:
'last-name'
或"last-name"
){...}
(${last-name}
)中注意,扩展规则适用于 * 命令名称*(函数、cmdlet、脚本或可执行文件的名称及其别名)和 * 模块名称*:
-
("连字符","减号",松散地:"破折号").
("句号"、"句号")\
)和/
)在命令名称中,除了函数和cmdlet名称(您甚至不能用其他字符 * 定义 *)之外,您可以在名称中使用其他字符,只要在调用时将命令名称用引号 * 引起来即可。
然而,这样做是不明智的,因为用户通常期望命令不需要这样的引用;举一个人为的例子:
Set-Alias 'a&b' Get-Date; & 'a&b'
在技术上是可行的,但是调用的笨拙(引用,然后需要&
)使其成为一个糟糕的选择。ukdjmx9f3#
只是没有使用
books
:哎呀。