遍历XML层次结构并获取具有特定属性的所有节点

时间:2019-04-09 14:16:10

标签: xml powershell

我从一个仅支持一些相当可疑的XML导出的解决方案中提取了一些数据。我需要遍历Powershell中的层次结构以列出所有 type =“ node” 的对象,无论它们在层次结构中有多深,并具有属性“ KeySecret” ,然后返回该对象的“名称”属性的值以及它所属的父对象 type =“ Domain” 的“名称”属性的值。

不能根据我尝试过的 select-xml -xpath 来解决这个问题。

我的XML的简短版本

<?xml version="1.0"?>
<Object id="1.1622157565" type="Domain">
  <Property type="String" name="name" value="ROOTDOMAIN"/>
  <Object id="1.1131962319" type="Node">
    <Property type="String" name="name" value="AGENTLESS NODE 1"/>
  </Object>
  <Object id="1.1132169655" type="Domain">
    <Property type="String" name="name" value="SUBDOMAIN"/>
    <Object id="1.1132121638" type="Node">
      <Property type="BigNum" name="keySecret" value="1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"/>
      <Property type="String" name="name" value="AGENT NODE 1"/>
    </Object>
  </Object>
</Object>

关于如何结束此表的任何提示:

Domain        Node
------        ------
SUBDOMAIN     AGENT NODE 1

1 个答案:

答案 0 :(得分:0)

这是我到目前为止所得到的。我希望它能为您指明正确的方向。

[xml]$XML = @"
<?xml version="1.0"?>
<Object id="1.1622157565" type="Domain">
  <Property type="String" name="name" value="ROOTDOMAIN"/>
  <Object id="1.1131962319" type="Node">
    <Property type="String" name="name" value="AGENTLESS NODE 1"/>
  </Object>
  <Object id="1.1132169655" type="Domain">
    <Property type="String" name="name" value="SUBDOMAIN"/>
    <Object id="1.1132121638" type="Node">
      <Property type="BigNum" name="keySecret" value="1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"/>
      <Property type="String" name="name" value="AGENT NODE 1"/>
    </Object>
  </Object>
</Object>
"@

$keyNode = $xml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | Where-Object {$_.Name -like "keySecret"} 

$keyParent = $keyNode

do {
    $keyParent = $keyParent.ParentNode
} 
Until ($keyParent.type -like "Domain")

$output = New-Object PSObject
$output | Add-Member -MemberType NoteProperty Domain ($keyParent.ChildNodes | Where-Object {$_.type -eq "String"}).Value
$output | Add-Member -MemberType NoteProperty Node $keyNode.NextSibling.value

$output

keyNode:从XML中选择类似于'Name='的所有节点,然后选择类似于'keySecret'的任何节点

Do,Until循环将搜索父节点,直到父节点类型为“域”。这将使您找到埋在层次结构深处的节点。 “域”节点设置为$keyParent