在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;的孩子,所以我也需要它的字符串。
答案 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