获取2个XML标记之间的所有值

时间:2017-08-29 18:53:16

标签: xml powershell scripting

在PowerShell中,我试图根据category属性检索2个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>

所以我想根据<Report>标记输出这4个字符串,类别为&#34; thisone&#34;。我遇到了麻烦,因为两个XML标签都以&#34;报告&#34;但类别&#34; hi&#34;是#34;这个&#34;的孩子,所以我也需要它的字符串。

1 个答案:

答案 0 :(得分:2)

您可以将XML传输到Select-Xml并对其执行XPath搜索,如下所示:

$text = Get-Content C:\Path\To\File.xml
$text | Select-Xml -XPath '//Report[@category="thisone"]//String'|%{$_.Node.'#text'}

重要的部分是XPath搜索。 //表示来自XML根目录的所有内容,然后您查找属性为Report且值为category的{​​{1}}个节点。然后它查看"thisone"节点之后的所有节点(再次由//表示)。它将所有这些String节点传递给string循环(使用别名ForEach-Object),并且对于每个节点,它展开Node属性,以及其中的#text属性。这导致:

%

要将这些字符串输出到文件,您可以将第二行输出到test test2 hello hi again (或Set-Content,但该cmdlet有点过时的IMO。)

Out-File

或者要输出到屏幕和文件,您可以使用$text | Select-Xml -XPath '//Report[@category="thisone"]//String'|%{$_.Node.'#text'} | Set-Content C:\Path\To\NewFile.txt ,例如:

Tee-Object