在PowerShell中我试图使用XPath检索属性的值。在下面的例子中,我想获得“hi”类别的“name”值,这将是“new test”。
示例代码显示:
<Report name="test" category="thisone">
<String>test</String>
<String>test2</String>
<Report name="new test" category="hi">
<String>hello</String>
<String>hi again</String>
</Report>
</Report>
这就是我所拥有的:
Select-Xml -XPath "//Report[@name='test']/Report" | Select name |
Out-File "result.txt"
我的结果是:
name ----
我真的不需要指定category属性,因为<Report>
标记总是在第一个<Report>
标记之后,所以我认为使用XPath会更容易。< / p>
答案 0 :(得分:2)
您需要先扩展节点。 Select-XML正在提供该对象。如果你这样做:
Select-Xml -Xml $XML -XPath "//Report[@name='test']/Report"
你会得到
节点:报告
路径:InputStream
模式://报告[@name =&#39; test&#39;] /报告
扩展&#34; Node&#34;你将获得更多的属性
Select-Xml -Xml $XML -xPath "//Report[@name='test']/Report" | Select-Object –ExpandProperty “node” | select *
名称:新测试
类别:嗨
String:{hello,hi again}
LocalName:报告
...等...等
下面的完整概念
[xml]$XML = @"
<Report name="test" category="thisone">
<String>test</String>
<String>test2</String>
<Report name="new test" category="hi">
<String>hello</String>
<String>hi again</String>
</Report>
</Report>
"@
Select-Xml -Xml $XML -xPath "//Report[@name='test']/Report" | Select-Object –ExpandProperty “node” | select name
答案 1 :(得分:0)
XPath可以直接获取属性的值。
(Select-Xml -Xml $XML -xPath "//Report[@name='test']/Report/@name").Node.Value
(但仍需要从结果[XmlAttribute]
中提取值。)
答案 2 :(得分:0)
这是非xpath版本:
(get-content file.xml) -as 'xml' | foreach { $_.report.report.name }
new test
或另一个xpath:
get-content -raw file.xml | select-xml '//*[@category="hi"]/@name' |
% { $_.node.'#text' }
new test