Чтение 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