Выберите дочерний узел на основе атрибута из родительского узла - PullRequest
3 голосов
/ 24 марта 2020

Я пытаюсь выбрать значение из дочернего узла, основываясь на атрибуте родительского узла (из-за того, что родительский узел имеет похожие имена). Мне нужно получить все значения из узла на основе атрибута родителя (ID).

Поэтому для каждой записи мне нужно соответствующее ЗНАЧЕНИЕ (RECORD / FIELD / DATA / VALUE).

XML:

<PAGE id="8">
   <RECORD>
      <GUID>83704498-6ee6-4705-9280-0f0fe90e1148</GUID>
      <FIELD id="21">
         <DATA>
           <GUID>4a2bd78d-beab-4508-af76-0d14fe290709</GUID>
           <VALUE>Certificate 1</VALUE>
          </DATA>
      </FIELD>
      <FIELD id="22">
          <DATA>
              <VALUE>2015-01-20</VALUE>
          </DATA>
      </FIELD>
    <RECORD>
      <GUID>83704498-6ee6-4705-9280-0f0fe90e1148</GUID>
      <FIELD id="21">
         <DATA>
           <GUID>4a2bd78d-beab-4508-af76-0d14fe290709</GUID>
           <VALUE>Certificate 2</VALUE>
          </DATA>
      </FIELD>
      <FIELD id="22">
          <DATA>
              <VALUE>2015-01-20</VALUE>
          </DATA>
      </FIELD>
    </RECORD>
 </PAGE>

Powershell:

$record = $XML.SelectNodes('//PAGE/RECORD') | Select-Object @{'Name' = 'records' ; 'Expression' = { 
$_.FIELD.DATA.VALUE} }, GUID
$recordString = ($record | Out-String)
write-host $recordString

Этот вывод дает мне правильное значение и GUID, но я получаю значения из всех полей, но мне нужно только значение из поля с атрибутом ID = 21.

1 Ответ

3 голосов
/ 24 марта 2020

Используйте другое выражение XPath для нацеливания только на узлы DATA в FIELD с id=21:

$XML.SelectNodes('//PAGE/RECORD') | Select-Object @{
    'Name' = 'records'
    'Expression' = { 
        $_.SelectNodes('FIELD[@id="21"]/DATA/VALUE').innerText
    }
}, GUID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...