我在以最有效的方式从XML获取具有特定名称的节点的所有值时遇到问题。
例如:
Node One
Note Two
I dont want that
Node Three
Node Four
Node Five
我想从XML获得这些值:
节点一
节点二
节点三
节点四
节点五
我希望能够用这样的代码做同样的事情:
Something I dont want
Something I dont want
Something I dont want
并获得:
论据一
论点二
论据三
有任何想法吗?到目前为止,我尝试做:
$xdoc = New-Object System.Xml.XmlDocument
$file = Resolve-Path("C:\CompiledDynoview.xml")
$xdoc.load($file)
[xml] $xdoc = Get-Content $file
$xdoc.h1.MyNode
$xdoc.h1.h2.MyNode
$xdoc.h1.h3.MyNode
...
但这似乎不是最好的方法。应该有更好的东西。
您在这里尝试做不同的事情,因此您将无法对两个操作使用完全相同的代码。
在第一个示例中,您要选择名称为的所有节点的值MyNode
。选择带有XPath表达式 的节点//MyNode
并展开其#text
属性。有多种方法可以执行此操作,例如Select-Xml
,使用@PetSerAl建议:
Select-Xml -XPath '//MyNode' -Path 'C:\path\to\first.xml' | Select-Object -Expand Node | Select-Object -Expand '#text'
或通过将文件作为XmlDocument
对象导入并使用其SelectNodes()
方法:
[xml]$xml = Get-Content 'C:\path\to\first.xml' $xml.SelectNodes('//MyNode') | Select-Object -Expand '#text'
在第二个示例中,您MyArgument
要从具有该特定属性的所有节点中选择属性的值。使用XPath表达式//@MyArgument
选择所有属性MyArgument
,然后像以前一样扩展它们的值,如下所示:
Select-Xml -XPath '//@MyArgument' -Path 'C:\path\to\second.xml' | Select-Object -Expand Node | Select-Object -Expand '#text'
或像这样:
[xml]$xml = Get-Content 'C:\path\to\second.xml' $xml.SelectNodes('//@MyArgument') | Select-Object -Expand '#text'
边注:
$xml = New-Object System.Xml.XmlDocument $xml.load('C:\path\to\your.xml')
和
[xml]$xml = Get-Content 'C:\path\to\your.xml'
做同样的事情,所以不要使用两者之一。