Как извлечь дочерние узлы с тем же дочерним именем, но разными значениями в PowerShell? - PullRequest
0 голосов
/ 29 апреля 2019

В файле XML есть дочерние узлы, которые имеют одинаковое имя узла, но с разными значениями, как видно из примера.

Я уже пробовал то, что мог найти в Интернете, ноувы ничего не получалось.Более того, я новичок в PowerShell и видел, что он действительно мощный, но это просто сложно из-за определенного дочернего узла, как вы можете видеть в примере.

chdir('\\folder')
[xml]$XmlDocument = Get-Content "football.xml"

Первая попытка:

foreach ($s in $XmlDocument.entities.entity.ext) {
    $attribs = $s.Attributes
    if ($attribs = 'Alias') {
        $s
    }
}

Не уверен, что я здесь делаю, но я пытался перебрать файл, чтобы получить значение для дочернего узла 'Alias' в <ext> дочернем узле.

Затем я попробовал следующее:

$XmlDocument.SelectNodes("//entities/entity/ext") | ForEach Object {
    New-Object -Type PSObject -Property @{
        Name  = $s_.name
        Alias = $s_.alias
    }
}

Но это тоже не сработало.Я также попытался экспортировать все в CSV:

$XmlDocument.entities.ChildNodes |
    Export-Csv "footballers.csv" -NoTypeInformation -Delimiter:";" -Encoding:UTF8

, который работает очень хорошо, но вывод для дочерних узлов <ext> представляет собой агрегированное сообщение об ошибке.

Таким образом, ввод будеткак ниже.И, как видно, узлы <ext> распределены неравномерно, что делает его еще более сложным.Иногда в некоторой сущности есть определенные <ext> узлы, а иногда нет.

<entities>
    <entity id="1" version="1928">
        <name>Ronaldo, Cristiano</name>
        <datebirth>02/05/1985</datebirth>
        <country>Portugal</country>
        <ext name="Alias">Ronnie</ext>
        <ext name="Height">187</ext>
        <ext name="Nationality">Portuguese</ext>
        <ext name="Club">Juventus</ext>
        <ext name="Previously">Real Madrid</ext>
        <ext name="Brand">CR7</ext>
    </entity>
    <entity id="24" version="1928">
        <name>Messi, Lionel</name>
        <datebirth>06/24/1987</datebirth>
        <country>Argentina</country>
        <ext name="Alias">La Pulga</ext>
        <ext name="Height">170</ext>
        <ext name="Nationality">Argentine</ext>
        <ext name="Club">FC Barcelona</ext>
    </entity>
</entities>

И затем я хотел бы преобразовать все это в файл CSV со всей информацией внутри вывода.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Ваша вторая попытка привела вас почти к цели, но у вас есть выражение XPath, которое выбирает все <ext> узлы. Вам нужно выражение, которое выбирает все <entity> узлы, которые содержат дочерний узел <ext> с атрибутом name, который имеет значение Alias.

//entities/entity[ext[@name='Alias']]

Затем вы можете создавать свои собственные объекты, как это:

New-Object -Type PSObject -Property @{
    Name  = $_.name
    Alias = $_.SelectSingleNode("./ext[@name='Alias']").'#text'
}
0 голосов
/ 30 апреля 2019

Без использования XPath это должно работать:

[xml]$XmlDocument = Get-Content "football.xml"

$data = foreach ($entity in $XmlDocument.entities.entity) {
    [PSCustomObject]@{
        'Name' = $entity.name
        'Alias' = ($entity.ext | Where-Object { $_.name -eq 'Alias' }).InnerText   # or use .'#text'
    }
}

$data | Export-Csv -Path '<PATH AND FILENAME FOR THE EXPORTED CSV FILE' -NoTypeInformation -Delimiter ';' -Encoding UTF8

$data будет содержать массив объектов PSCustomObjects, которые можно легко экспортировать в файл CSV.
При выводе на консоль это будет выглядеть так:

Name               Alias   
----               -----   
Ronaldo, Cristiano Ronnie  
Messi, Lionel      La Pulga
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...