获取2个XML标签之间的所有值
问题描述:
在PowerShell中,我试图根据category属性检索2个XML标签之间的所有字符串值。获取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>
所以我想输出的那些4个字符串的基础上,<Report>
标签与类别“thisone”。由于两个XML标签都以“Report”开头,但类别“hi”是“thisone”的子项,所以我也遇到了麻烦,所以我也需要它的字符串。
答
可以通过管道的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
,值为"thisone"
。然后查看String
节点之后的所有节点(同样用//
表示)。它将所有这些string
节点传递给ForEach-Object
循环(使用的别名为%
),并且对于其中的每个节点,它都展开Node属性以及其中的#text属性。这导致:
test
test2
hello
hi again
要输出的字符串到一个文件你可以管的第二行以Set-Content
(或Out-File
,但该cmdlet是有点过时IMO)。
$text | Select-Xml -XPath '//Report[@category="thisone"]//String'|%{$_.Node.'#text'} | Set-Content C:\Path\To\NewFile.txt
或者输出到屏幕和文件,你可以使用Tee-Object
如:
$text | Select-Xml -XPath '//Report[@category="thisone"]//String'|%{$_.Node.'#text'} | Tee-Object -FilePath C:\Path\To\NewFile.txt
它看起来像这样的工作!我使用了Out-File,而且工作得很好。我没有意识到的是,它将所有的字符串值(所有类别与'thisone')组合在一起。有没有一种方法可以将它们作为变量存储在数组中以区分彼此?这将允许我Out-File每次出现... – Awsmike
好吧,当然,如果您将输出重定向到文件,那么它不会显示任何内容。那就是那种目的。如果你想输出到文件以及显示的东西,你可以使用'Tee-Object' – TheMadTechnician
我编辑我的评论,因为我有一个错字。我现在将它输出到一个文件中,但是我很难将第一个“thisone”与第二个文件分开,因为它将所有东西都放入一个文件中。我正在考虑将它们作为变量存储在数组中将成为... – Awsmike