我从一个仅支持一些相当可疑的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
答案 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
。