如何从多个节点值中选择Powershell中的特定XML节点?

时间:2018-04-24 14:18:46

标签: xml powershell xml-parsing

我有以下XML语法,我试图获取节点ID中的值" 2",Row Key" Vol2-3"现在:

<nodes>
   <node id="1">
     <store>
        <row key="Vol1-1" value="1a"/>
        <row key="Vol1-2" value="1b"/>
        <row key="Vol1-3" value="1c"/>
        <row key="Vol1-4" value="1d"/>
</store>
</node>
   <node id="2">
     <store>
        <row key="Vol2-1" value="2a"/>
        <row key="Vol2-2" value="2b"/>
        <row key="Vol2-3" value="2c"/>
        <row key="Vol2-4" value="2d"/>
</store>
</node>
   <node id="3">
     <store>
        <row key="Vol3-1" value="3a"/>
        <row key="Vol3-2" value="3b"/>
        <row key="Vol3-3" value="3c"/>
        <row key="Vol3-4" value="3d"/>
</store>
</node>
</nodes>

代码:

$nodevar=2 
[xml]$XMLDoc=(Get-Content "\..\..somefile.txt")
$value_extract=$XMLDoc.nodes.SelectNodes("node[@id='$nodevar']").store.SelectNodes("row[@key='']")

我遇到的问题是我尝试将$ value_extract变量设置为从正确的节点ID转移到包含我的值的相应行键。我用这样的方式编写它,我最终会在for循环中使用SelectNodes来获取进一步处理所需的值。有没有一种好的方法来写这个,因为我正在转移正确的节点ID以及正确的行键?

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解您的枢轴问题,但如果您只需要获取文本值,这应该可行:

[xml]$xml = Get-Content "somexml.xml"
$nodevar = "2"
$keyvar = "Vol2-3"
$value_extract=$xml.SelectNodes("/nodes/node[@id='$nodevar']/store/row[@key='$keyvar3']/@value")

答案 1 :(得分:0)

或者不使用xpath语法:

$node = $XMLDoc.nodes.node | ? id -eq '2'
$row = $node.store.row | ? key -eq 'Vol2-3'
$row.value