以下是我的示例XML:
<root>
<Countries>
<Country Name="USA">
<MyFilters>
<Filter>aaa</Filter>
<Filter>bbb</Filter>
<Filter>ccc</Filter>
<Filter>ddd</Filter>
</MyFilters>
</Country>
</Countries>
</root>
我正在尝试遍历每个<Filter>
标记并使用其值 - &#34; aaa&#34;,&#34; bbb&#34;,...用于我在PowerShell中的后续过程。我正在使用XPath来访问这些值。
这是我的剧本:
[xml]$config_xml = Get-Content $config_path
$Country = $config_xml.selectnodes('/root/Countries/Country[@Name = "USA"]/MyFilters')
foreach ($Filter in $Country) {
Write-Host $Filter.InnerText
}
但是这会在一行中输出所有<Filter>
值,如下所示:aaa bbb ccc ddd
。如何使用我的XPath一次获取一个过滤器?或者有没有办法将此输出转换为PowerShell数组对象,我可以再次循环?
答案 0 :(得分:3)
您的XPath查询返回<MyFilters>
节点,而不是其子节点,因此InnerText
是该节点的文本内容(即所有子节点的组合)。
如果您想一次遍历一个Filter
,只需添加另一个引用Filter
元素的步骤:
/root/Countries/Country[@Name = "USA"]/MyFilters/Filter
或者如果MyFilters
的子元素可能有各种名称,您可以使用*
:
/root/Countries/Country[@Name = "USA"]/MyFilters/*
只是一些笔记。 child
是XPath中的默认轴,因此/child::node()
与/node()
相同。然后node()
返回所有类型的节点(元素,文本,注释等),因此*
可能更合适,因为您只想返回元素节点。
答案 1 :(得分:2)
V3 +
## Replace me with
#[xml]$config_xml = Get-Content $config_path
[xml]$config_xml = @'
<root>
<Countries>
<Country Name="USA">
<MyFilters>
<Filter>aaa</Filter>
<Filter>bbb</Filter>
<Filter>ccc</Filter>
<Filter>ddd</Filter>
</MyFilters>
</Country>
</Countries>
</root>
'@
($config_xml.root.Countries.Country| Where-Object Name -EQ USA).MyFilters.Filter
答案 2 :(得分:0)
我刚刚想出了解决方案,如果有人需要,请在这里分享。
我使用child :: node()来获取所有子节点,然后循环使用它。
ios_base