2017-08-29 92 views
0

在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”的子项,所以我也遇到了麻烦,所以我也需要它的字符串。

回答

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,值为"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 
+0

它看起来像这样的工作!我使用了Out-File,而且工作得很好。我没有意识到的是,它将所有的字符串值(所有类别与'thisone')组合在一起。有没有一种方法可以将它们作为变量存储在数组中以区分彼此?这将允许我Out-File每次出现... – Awsmike

+0

好吧,当然,如果您将输出重定向到文件,那么它不会显示任何内容。那就是那种目的。如果你想输出到文件以及显示的东西,你可以使用'Tee-Object' – TheMadTechnician

+0

我编辑我的评论,因为我有一个错字。我现在将它输出到一个文件中,但是我很难将第一个“thisone”与第二个文件分开,因为它将所有东西都放入一个文件中。我正在考虑将它们作为变量存储在数组中将成为... – Awsmike