Powershell: select XML 节点值按元素索引放入变量

Powershell: select XML node value into variable by element index

我有这个 PowerShell 脚本,我用它来解析 XML 文件的不同方面。因此,我想检索特定 XML 节点的值并将其保存到变量中。我想要 select 的这个节点在 XML 文件中存在多次,因此我需要能够提及我想要检索的节点的具体编号。

XML-文件:

<lvl1>
    <lvl2>
        <lvl3>
            <lvl4>test1</lvl4>
            <lvl4>test2</lvl4>
            <lvl4>test3</lvl4>
        </lvl3>
    </lvl2>
</lvl1>

我尝试过的 Powershell 脚本:

1 无返回且无错误

[xml] $response = get-content "FilePath\Resp.xml"
[string] $Var = $response.SelectSingleNode('lvl1/lvl2/lvl3/lvl4[2]').InnerText

2 返回错误:"cannot index into a null array."

[xml] $response = get-content "FilePath\Resp.xml"
$Var = $response.lvl1.lvl2.lvl3.lvl4[2].'#text'

BACON 基本上提供了对问题的评论中的关键指针:

直接使用PowerShell的点符号n returns叶子元素的文本内容(只有文本子节点的元素), 所以 不需要 '.#text':

# Note: `.lvl4` is an *array* provided by PowerShell, so the index is 
#       0-based. Therefore, [2] retrieves the *3rd* element.
$response.lvl1.lvl2.lvl3.lvl4[2]  # -> 'test3'

请注意,PowerShell 将多个 lvl4 元素公开为一个 数组 ,因此 索引 到该数组是 0-based.


您的基于 XPath 的命令应该按原样工作,但请注意,XPath 中的 索引是基于 1 ,因此 [2] 将引用 2nd 元素:

$response.SelectSingleNode('lvl1/lvl2/lvl3/lvl4[2]').InnerText # -> 'test2'

# Equivalent commands:
$response.SelectSingleNode('lvl1/lvl2/lvl3/lvl4[2]').'#text'
$response.SelectSingleNode('lvl1/lvl2/lvl3/lvl4[2]/text()').Value