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
有关此主题的更多信息
4sysops - Add a calculated property with select object in powershell
我有几百万行 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
有关此主题的更多信息
4sysops - Add a calculated property with select object in powershell