Powershell - XML - Как извлечь несколько значений из разных глубин для каждого семейства узлов - PullRequest
0 голосов
/ 15 января 2020

У меня есть несколько миллионов строк xml для анализа. Для одного приложения я хочу извлечь 3 фрагмента данных для использования в других сценариях.

xml выглядит примерно так (несколько десятков тегов были удалены за группу). Я могу изменить одно из названий теги, если это помогает; хотя не желательно, это потребует некоторой промежуточной обработки. Не все группы узлов имеют расширенные атрибуты.

<?xml version="1.0" encoding="IBM437"?>
<topo>
    <node>
        <name>device1Name</name>
         <extendedAttributes>
            <attribute>
                <name>tagCategoryName</name>
                <value>tagValue</value>
            </attribute>
        </extendedAttributes>
     </node>
    <node>
        <name>device2Name</name>
        <extendedAttributes>
            <attribute>
                <name>tagCategoryName</name>
                <value>tagValue</value>
            </attribute>
        </extendedAttributes>
    </node>
    <node>
        <name>device3Name</name>
    </node>
...
...
</topo>

Вывод, который я ищу для каждого узла:

deviceName   tagCategoryName   tagValue

Я попытался несколько подходов и не смог найти элегантный решение. Началось с

$xml = [xml](get-content prodnodes.txt)

Попробовал несколько Select- Xml с xpath, с прямым $ xml .topo.node, адресовавшим трубопровод для выбора объекта с использованием имен свойств. Мне не удалось нацелиться на имена эффективно с помощью следующего.

$xml.topo.node | select-object -property name, extendedAttributes.attribute.name, extendedAttributes.attribute.value

Было бы возвращено только имя Следующее сработало, чтобы получить мне дополнительный атрибут, но я не мог расширить его без выпуски.

$munge = $xml.topo.node | select-object -property name, {$_.extendedAttributes.attribute.name}

Попытка его расширения выглядела следующим образом

$munge = $xml.topo.node | select-object -property name, {$_.extendedAttributes.attribute.name, $_.extendedAttributes.attribute.value}

, которая выдает такой вывод

deviceName1   {tagCategoryName1, tagValue1}
deviceName2   {tagCategoryName1, tagValue2}
deviceName3   {$null, $null}
deviceName4   {tagCategoryName2, tagValue3}
...
...

Есть ли способ убрать это или другой, более эффективный подход?

1 Ответ

0 голосов
/ 15 января 2020

Ваш первый подход был почти правильным. При этом для того, чтобы копаться в таких свойствах, вам необходимо использовать вычисляемые свойства.

Вычисляемые свойства представлены хеш-таблицей, содержащей элемент name, который будет именем вашего столбца, и элемент выражения, который содержит блок сценария для выполнения чего-то большего, чем то, что вы можете сделать простым выбором.

Вот как вам нужно это сделать в вашем сценарии.

Оператор

$xml.topo.node | select-object -property name, 
@{'Name' = 'TagName' ; 'Expression' = { $_.extendedAttributes.attribute.name } },
@{'Name' = 'TagValue' ; 'Expression' = {$_.extendedAttributes.attribute.value}}

Результат

name        TagName         TagValue
----        -------         --------
device1Name tagCategoryName tagValue
device2Name tagCategoryName tagValue
device3Name

Дополнительная информация по этой теме c

Microsoft - Выбрать- Object

4sysops - добавьте вычисляемое свойство с помощью объекта select в powershell

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