使用XPath检索特定属性的属性值

时间:2017-08-30 15:01:46

标签: xml powershell scripting

在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>

3 个答案:

答案 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