Цикл по XML с помощью PowerShell - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь пройтись по XML с помощью PowerShell, но не могу получить InnerXML подробности.

XML:

<script>
    <data>
        <address>
            <street>WhiteField</street>
            <zip>560100</zip>
            <city>Bangalore</city>
            <country>India</country>
            <postofficebox>BangaloreEast</postofficebox>
        </address>
    </data>
    <data>
        <address>
            <street>Gurgaon</street>
            <zip>601000</zip>
            <city>New Delhi</city>
            <country>India</country>
            <postofficebox>New Delhi West</postofficebox>
        </address>
    </data>
</script>

Сценарий:

[string]$FilePath = 'C:\Users\Sujeet\Desktop\UserData.xml'

try {
    [xml]$XMLInput = Get-Content -Path $FilePath
} catch {
    Write-Host "Failed to read or parse the XML File."
    exit
}

if ((Select-Xml -Xml $XMLInput -XPath "//address" | measure).Count -gt 0) {
    Select-Xml -Xml $XMLInput -XPath "//address" | foreach {
        $_.Node.InnerXML
    }
}

Как получить значения для <street>, <city>, <country>?

Также я хочу получить подробности, только если город "Бангалор".

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вот альтернативный способ:

[xml]$xml = "<script>
    <data>
        <address>
            <street>WhiteField</street>
            <zip>560100</zip>
            <city>Bangalore</city>
            <country>India</country>
            <postofficebox>BangaloreEast</postofficebox>
        </address>
    </data>
    <data>
        <address>
            <street>Gurgaon</street>
            <zip>601000</zip>
            <city>New Delhi</city>
            <country>India</country>
            <postofficebox>New Delhi West</postofficebox>
        </address>
    </data>
</script>"

$addresses = $xml.script.data | Select-Object -ExpandProperty address
foreach ($address in $addresses) {
    if($address.city -eq 'Bangalore') {
        $address.street
    }
}
0 голосов
/ 28 августа 2018

InnerXml выдает содержимое узла XML в виде строки. Не используйте его, если вы хотите получить доступ к вложенным элементам. $_.node это объект. Дочерние узлы этого объекта могут быть доступны следующим образом:

Select-Xml -Xml $XMLInput -XPath '//address' | ForEach-Object {
    $street = $_.Node.street
    $city   = $_.Node.city
    ...
}

Использование dot-access автоматически расширяет значение узла.

Чтобы ограничить результаты определенным городом, добавьте фильтр в выражение XPath:

$city = 'Bangalore'
Select-Xml -Xml $XMLInput -XPath "//address[city='${city}']" | ForEach-Object {
    $street = $_.Node.street
    $city   = $_.Node.city
    ...
}

В качестве альтернативы вы можете использовать метод SelectNodes() вместо Select-Xml:

$city = 'Bangalore'
$XMLInput.SelectNodes("//address[city='${city}']") | ForEach-Object {
    $street = $_.street
    $city   = $_.city
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...