Цикл по иерархии XML и получить все узлы с определенными свойствами - PullRequest
0 голосов
/ 09 апреля 2019

Я извлек некоторые данные из решения, которое поддерживает только некоторые довольно подозрительные экспорты XML. Мне нужно пройти через иерархию в Powershell, чтобы перечислить все объекты type = "node" , независимо от их глубины в иерархии, которые имеют свойство "KeySecret" и вернуть значение свойства "name" этого объекта и значение свойства "name" родительского объекта 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 голосов
/ 09 апреля 2019

Вот что я получил до сих пор.Я надеюсь, что он направит вас в правильном направлении.

[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, Пока не будет искать родительские узлы, пока тип родительского узла не будет «Домен».Это позволит вам найти узел, скрытый глубоко в иерархии.Узел «Домен» установлен как $keyParent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...