Как прочитать файл XML с помощью PowerShell и отфильтровать необходимые данные - PullRequest
0 голосов
/ 05 мая 2019

Как прочитать файл XML и извлечь данные из этого файла, который имеет большое количество тегов, используя PowerShell?Я использую приведенный ниже код для извлечения тега, но не могу прочитать данные из вложенного тега.

$xmlFile= "D:\Testing\TestcasesOutput\1ac.xml"
$xmlConfig = [System.Xml.XmlDocument](Get-Content $xmlFile)
$XmlDocument.Breakfast_menu.price

Я ожидаю, что выходные данные прочитают весь XML-файл, но не могут прочитать весь XML-файл.

<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
    <food>
        <food>Belgian Waffles</food>
        <price>$5.95</price>
        <description>Two of our famous Belgian Waffles with plenty of real maple 
        syrup</description>
        <calories>650</calories>
    </food>
    <food>
        <food>Strawberry Belgian Waffles</food>
        <price>$7.95</price>
        <description>Light Belgian waffles covered with strawberries and whipped 
        cream</description>
        <calories>900</calories>
    </food>
    <food>
        <food>Berry-Berry Belgian Waffles</food>
        <price>$8.95</price>
        <description>Light Belgian waffles covered with an assortment of fresh 
        berries and whipped cream</description>
        <calories>900</calories>
    </food>
    <food>
        <food>French Toast</food>
        <price>$4.50</price>
        <description>Thick slices made from our homemade sourdough 
        bread</description>
        <calories>600</calories>
    </food>
    <food>
    <food>Homestyle Breakfast</food>
        <price>$6.95</price>
        <description>Two eggs, bacon or sausage, toast, and our ever-popular hash 
        browns</description>
        <calories>950</calories>
    </food>
</breakfast_menu>

1 Ответ

2 голосов
/ 05 мая 2019

Чтение XML с помощью PowerShell действительно просто.

Предположим, ваш xml-файл выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?> 
<breakfast_menu> 
    <food> 
        <food>Belgian Waffles</food>
        <price>$5.95</price>
        <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description>
        <calories>650</calories>
    </food>
    <food> 
        <food>Fried Egg</food>
        <price>$1.80</price>
        <description>blahblah</description>
        <calories>3500</calories>
    </food>
</breakfast_menu>

Вы просто читаете и PowerShell анализирует файл в объект, используя это

[xml]$xml = Get-Content 'D:\Testing\TestcasesOutput\1ac.xml'

Далее, вы можете использовать свойства этого $xml объекта, чтобы получить то, что вы хотите извлечь из него:

Например, перебрать все элементы <food> и вывести нужную информацию

$xml.breakfast_menu.food | ForEach-Object {
    [PSCustomObject]@{
        'MenuItem' = $_.food
        'Price'    = $_.price
    }
}

приводит к выводу:

MenuItem        Price
--------        -----
Belgian Waffles $5.95
Fried Egg       $1.80

Или выберите только один предмет для 'Бельгийские вафли':

$xml.breakfast_menu.food | Where-Object { $_.food -eq 'Belgian Waffles' } | 
                           Select-Object @{Name = 'MenuItem'; Expression = {$_.food}}, Price
* * +1025 выходы:
MenuItem        price
--------        -----
Belgian Waffles $5.95

Если все, что вам нужно, это цена на определенный продукт питания, вы можете сделать это:

$xml.breakfast_menu.food | Where-Object { $_.food -eq 'Belgian Waffles' } | 
                           Select-Object -ExpandProperty Price

или даже сократить этот код:

($xml.breakfast_menu.food | Where-Object { $_.food -eq 'Belgian Waffles' }).price

Надеюсь, что это объясняет


Редактировать

Если вам нужно сделать это для нескольких файлов xml, и эти файлы находятся внутри корневого пути с одинаковым , вы можете циклически использовать Get-ChildItem, чтобы получить файлы XML и обработать их, как в примерах, которые я дал.

Get-ChildItem -Path 'ROOTFOLDER OF THE FOLDERS WHERE THE XML FILES ARE KEPT' -Filter '*.xml' -File -Recurse | 
    ForEach-Object {
        [xml]$xml = Get-Content -Path $_.FullName
        # in this example simply output the menu items and their price for each xml file
        foreach ($item in $xml.breakfast_menu.food) {
            [PSCustomObject]@{
                'File'     = $_.FullName    # added the file FullName so you know where the item came from
                'MenuItem' = $item.food
                'Price'    = $item.price
            }
        }
    }

Или из нескольких мест:

$folders = 'D:\Testing\TestcasesOutput\1ac7b5a0-2d62-403c-8394-5bd33330cbe7',
           'D:\Testing\TestcasesOutput\227c619a-b7d1-4da6-8fe5-f2c923ddcb7a',
           'D:\Testing\TestcasesOutput\d4370ae1-643f-4c44-ba41-7f640afcc276'

$result = Get-ChildItem -Path $folders -Filter '*.xml' -File | 
    ForEach-Object {
        [xml]$xml = Get-Content -Path $_.FullName
        # in this example simply output the menu items and their price for each xml file
        foreach ($item in $xml.breakfast_menu.food) {
            [PSCustomObject]@{
                'File'     = $_.FullName
                'MenuItem' = $item.food
                'Price'    = $item.price
            }
        }
    }

#output to screen:
$result

# output to CSV
$result | Export-Csv -Path 'PATH AND FILENAME FOR THE OUTPUT CSV FILE' -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...