Powershell选择XML节点,其中包含数组中的属性

时间:2012-10-24 14:51:47

标签: xml powershell xpath

说我有类似的结构:

[xml]$i = "
<root>
    <item>
        <id>1</id>
        <data>Content_Of_1</data>
    </item>
    <item>
        <id>2</id>
        <data>Content_Of_2</data>
<item>
    <id>5</id>
    <data>Content_Of_5</data>
</item>
    </item>
</root>
"

$foo = @(1,2,3)

我想选择$ i.root.item.data,其中$ i.root.item.id在$ foo中。

要选择匹配数组中ID的节点,我可以这样做:

($i.root.item | ? {$foo -contains $_.id})

但出于某种原因,如果我试图获得$ _。数据,我什么也得不到:

($i.root.item | ? {$foo -contains $_.id}).data

为什么?

1 个答案:

答案 0 :(得分:1)

  

但出于某种原因,如果我试图获得$ _。数据,我什么也得不到:

($i.root.item | ? {$foo -contains $_.id}).data

您没有得到任何结果的原因是您正在尝试访问整个集合中不存在的属性(数据)。您需要执行以下操作:

$i.root.item | ? {$foo -contains $_.id} | ForEach-Object { $_.data }

访问每个对象的数据属性。 您还可以在每个对象的data属性中选择值:

$i.root.item | ? {$foo -contains $_.id} | Select-Object data

这会产生一个PSCustomObjects数组,其中每个对象都包含一个名为data的属性(与ForEach-Object示例中的字符串数组相反)。

请注意,在Powershell 3.0中,使用新的属性枚举功能,原始语法将产生所需的结果,因为枚举将自动完成。