首页 > 解决方案 > powershell,xml,如何区分和元素

问题描述

读取数据后,是否可以区分 XML 数据(属性或元素)中值的来源?如果我运行以下脚本

$xml= [xml]@'
<?xml version="1.0" encoding="utf-8"?>
<root>
    <item id="001">
    </item>
    <item>
        <id>002</id>
    </item>
    <item id="003">
        <id>003 bis</id>
    </item>
</root>
'@

$items = Select-Xml -Xml $xml -XPath '//item'
$items | %{ $_.node }

$_.node对于前两个项目,我得到相同的结构,最后一个id项目的值数组id

id
--
001
002
{003, 003 bis}

标签: xmlpowershell

解决方案


PowerShell对XML DOM 的改编表示属性子元素,就好像它们是XML 元素的属性一样。

但是,非叶 XML 元素(具有作为元素的属性和/或子节点的元素)保留其System.Xml.XmlElement身份,并使用 PowerShell 的 ETS(扩展类型系统)简单地用表示属性和子元素的属性进行装饰。

因此,您可以访问XmlElement的本机类型成员(属性和方法),这允许您区分属性和子元素:

$xml= [xml] @'
<?xml version="1.0" encoding="utf-8"?>
<root>
    <item id="001">
    </item>
    <item>
        <id>002</id>
    </item>
    <item id="003">
        <id>003 bis</id>
    </item>
</root>
'@

Select-Xml -Xml $xml -XPath '//item' | ForEach-Object {
  [pscustomobject] @{
    IdAttribute = $_.Node.GetAttribute('id')   # get attribute
    IdChildElement = $_.Node['id'].InnerText   # get child element 
  }
}

以上产生:

IdAttribute IdChildElement
----------- --------------
001         
            002
003         003 bis

推荐阅读