【问题标题】:Powershell: select XML node value into variable by element indexPowershell:按元素索引将XML节点值选择为变量
【发布时间】:2020-06-04 02:42:39
【问题描述】:

我有这个 PowerShell 脚本,我用它来解析 XML 文件的不同方面。因此,我想检索特定 XML 节点的值并将其保存到变量中。我要选择的这个节点在 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 返回错误:“无法索引到空数组。”

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

【问题讨论】:

  • 第三个&lt;lvl4&gt; 以另一个&lt;lvl4&gt; 而不是&lt;/lvl4&gt; 终止。我认为这不在原始文件中?修复后,$response.SelectSingleNode('lvl1/lvl2/lvl3/lvl4[2]').InnerText$response.lvl1.lvl2.lvl3.lvl4[2](没有 .'#text')在 PowerShell v5.1.18362.145 上为我工作。
  • 您考虑过使用Select-Xml 吗?
  • 错过了编辑超时,但我应该添加第一个 sn-p 返回test2,第二个(修改后的)返回test3。您要检索哪个?

标签: xml powershell xpath xmldocument xmlnode


【解决方案1】:

BACON 实质上在 cmets 中提供了关于该问题的关键指针:

使用PowerShell的点表示法n 直接返回叶子元素(只有文本子节点的元素)的文本内容,所以不需要@987654322 @

# 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 的。


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

$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

【讨论】:

  • 在通往该节点的路径中打错字。比较愚蠢。您的所有解决方案确实有效!
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2013-10-08
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多