У меня есть несколько миллионов строк 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}
...
...
Есть ли способ убрать это или другой, более эффективный подход?