循环子节点

时间:2016-01-04 03:32:20

标签: xml powershell xpath

以下是我的示例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数组对象,我可以再次循环?

3 个答案:

答案 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
相关问题