Powershell: выберите XML значение узла в переменной по индексу элемента - PullRequest
1 голос
/ 19 февраля 2020

У меня есть сценарий PowerShell, который я использую для анализа различных аспектов XML -файла. Поэтому я хотел бы получить значение указанного c XML -узла и сохранить его в переменной. Этот узел, который я хотел бы выбрать, существует несколько раз в XML -файле, поэтому мне нужно иметь возможность упомянуть указанный c номер узла, который я хочу получить.

XML -файл:

<lvl1>
    <lvl2>
        <lvl3>
            <lvl4>test1</lvl4>
            <lvl4>test2</lvl4>
            <lvl4>test3</lvl4>
        </lvl3>
    </lvl2>
</lvl1>

Сценарии Powershell, которые я пробовал:

1, ничего не возвращая и без ошибок

[xml] $response = get-content "FilePath\Resp.xml"
[string] $Var = $response.SelectSingleNode('lvl1/lvl2/lvl3/lvl4[2]').InnerText

2 возвращаемая ошибка: «невозможно индексировать в нулевой массив».

[xml] $response = get-content "FilePath\Resp.xml"
$Var = $response.lvl1.lvl2.lvl3.lvl4[2].'#text'

1 Ответ

2 голосов
/ 19 февраля 2020

БЕКОН по существу предоставил ключевые указатели в комментариях к вопросу:

Использование Точечная нотация PowerShell n напрямую возвращает текстовое содержимое конечные элементы (элементы только с текстовым дочерним узлом), поэтому не нужно '.#text':

# Note: `.lvl4` is an *array* provided by PowerShell, so the index is 
#       0-based. Therefore, [2] retrieves the *3rd* element.
$response.lvl1.lvl2.lvl3.lvl4[2]  # -> 'test3'

Обратите внимание, что PowerShell предоставляет несколько элементов lvl4 как массив , поэтому индексирование в этот массив основано на 0.


Ваша команда XPath должен работать как есть, но учтите, что индексы в XPath * на основе *1030*, поэтому [2] будет ссылаться на элемент 2nd :

$response.SelectSingleNode('lvl1/lvl2/lvl3/lvl4[2]').InnerText # -> 'test2'

# Equivalent commands:
$response.SelectSingleNode('lvl1/lvl2/lvl3/lvl4[2]').'#text'
$response.SelectSingleNode('lvl1/lvl2/lvl3/lvl4[2]/text()').Value
...