Powershell - XML - 如何从每个节点系列的不同深度提取多个值

Powershell - XML - How do I extract multiple values from various depths per node family

我有几百万行 xml 需要解析。 对于一个应用程序,我希望提取 3 条数据以用于其他脚本。

xml 看起来像下面这样(每个分组已经删除了几十个标签) 如果有帮助,我可以更改其中一个名称标签;尽管不可取,但它需要一些中间处理。 并非所有节点组都具有扩展属性。

<?xml version="1.0" encoding="IBM437"?>
<topo>
    <node>
        <name>device1Name</name>
         <extendedAttributes>
            <attribute>
                <name>tagCategoryName</name>
                <value>tagValue</value>
            </attribute>
        </extendedAttributes>
     </node>
    <node>
        <name>device2Name</name>
        <extendedAttributes>
            <attribute>
                <name>tagCategoryName</name>
                <value>tagValue</value>
            </attribute>
        </extendedAttributes>
    </node>
    <node>
        <name>device3Name</name>
    </node>
...
...
</topo>

我寻找每个节点的输出是

deviceName   tagCategoryName   tagValue

我尝试了多种方法,但一直无法找到一个完美的解决方案。 开始于

$xml = [xml](get-content prodnodes.txt)

使用 xpath 尝试了一些 Select-Xml,使用 属性 名称直接将 $xml.topo.node 寻址到 select 对象的管道。我无法使用以下内容有效地定位名称。

$xml.topo.node | select-object -property name, extendedAttributes.attribute.name, extendedAttributes.attribute.value

它 return 只有名字 以下内容使我获得了一个附加属性,但我无法毫无问题地扩展它。

$munge = $xml.topo.node | select-object -property name, {$_.extendedAttributes.attribute.name}

尝试扩展它看起来像这样

$munge = $xml.topo.node | select-object -property name, {$_.extendedAttributes.attribute.name, $_.extendedAttributes.attribute.value}

给出了这样的输出

deviceName1   {tagCategoryName1, tagValue1}
deviceName2   {tagCategoryName1, tagValue2}
deviceName3   {$null, $null}
deviceName4   {tagCategoryName2, tagValue3}
...
...

有没有办法解决这个问题,或者其他更有效的方法?

您的第一种方法几乎是正确的。 话虽这么说,为了深入研究这样的属性,您需要使用计算属性。

计算的属性由包含名称元素的哈希表表示,这将是您的列名称,以及包含脚本块的表达式元素,可以做一些简单的 select 无法完成的事情。 =14=]

以下是您需要在您的场景中执行此操作的方法。

声明

$xml.topo.node | select-object -property name, 
@{'Name' = 'TagName' ; 'Expression' = { $_.extendedAttributes.attribute.name } },
@{'Name' = 'TagValue' ; 'Expression' = {$_.extendedAttributes.attribute.value}}

结果

name        TagName         TagValue
----        -------         --------
device1Name tagCategoryName tagValue
device2Name tagCategoryName tagValue
device3Name

有关此主题的更多信息

Microsoft - Select-Object

4sysops - Add a calculated property with select object in powershell