首页 > 解决方案 > XML“识别”标签

问题描述

我有一个 XML 文件,其中根元素有一个嵌套标签来标识节点。如何通过根元素中包含的特定标签来获取节点?

下面我有一个名为“master”的标签,它可以包含“旧”或“新”值。我怎么能抓住“新”?

示例文件:

<xml>
    <foo>
        <master>New</master>
        <data>
            <val1>Value</val1>
        </data>
    </foo>
    <foo>
        <master>Old</master>
        <data>
            <val1>Value</val1>
        </data>
    </foo>
</xml>

Select-XML 不起作用,因为有时文件具有未关闭的标签。

使用此代码,我可以从两个节点获取 val1

[xml] $xml = Get-Content "$file"

$xml.xml.foo.data

我试过了

$xml.xml.foo.data.val1 | Where-Object ($xml.xml.foo.master -eq "New")

我试过了

if ($xml.xml.foo.master -eq "New") {$xml.xml.foo.data.val1}

对不起,如果我的 xml 术语没有意义。

标签: xmlpowershell

解决方案


需要明确的是:如果输入 XML 格式不正确(语法上有效的 XML),则任何XML 解析解决方案都不会起作用 - 无论是通过强制转换[xml]还是通过Select-Xml.

如果您的 XML 格式正确

通过[xml]PowerShell 对 XML DOM 的改编

$xml.xml.foo.Where({ $_.master -eq 'New' }, 'First')

如果要查找具有文本内容的多个 master元素New,请删除该'First'参数。


通过Select-Xml(通过管道Select-Object -First 1限制到一个匹配项),如果 XML 也是有效的(格式正确符合引用的模式 - 对示例 XML 不适用):

(Select-Xml -XPath '/xml/foo[master="New"]' -LiteralPath file.xml).Node

至于使用Get-Content强制[xml]转换来解析 XML 文件:

  • 使用-RawwithGet-Content可以加快速度。

  • 当心可能误读XML 文件 - 请参阅此答案的底部。


推荐阅读