Анализ xml с использованием powershell

Я новичок в powershell. У меня есть config XML, который читается как -

<xml>
    <Section name="BackendStatus">
        <BEName BE="crust" Status="1" />
        <BEName BE="pizza" Status="1" />
        <BEName BE="pie" Status="1" />
        <BEName BE="bread" Status="1" />
        <BEName BE="Kulcha" Status="1" />
        <BEName BE="kulfi" Status="1" />
        <BEName BE="cheese" Status="1" />
    </Section>
</xml>

Мне нужно проанализировать каждый элемент в BEName, чтобы проверить статус. Как это можно сделать с помощью PowerShell?

Ответы

Ответ 1

Первый шаг - загрузить вашу XML-строку в XmlDocument, используя powershell's уникальная способность отличать строки до [xml]

$doc = [xml]@'
<xml>
    <Section name="BackendStatus">
        <BEName BE="crust" Status="1" />
        <BEName BE="pizza" Status="1" />
        <BEName BE="pie" Status="1" />
        <BEName BE="bread" Status="1" />
        <BEName BE="Kulcha" Status="1" />
        <BEName BE="kulfi" Status="1" />
        <BEName BE="cheese" Status="1" />
    </Section>
</xml>
'@

Powershell позволяет легко анализировать xml с помощью точечной нотации. Эта оператор создаст последовательность XmlElements для ваших элементов BEName:

$doc.xml.Section.BEName

Затем вы можете передать эти объекты в командлет where-object, чтобы отфильтровать Результаты. Вы можете использовать? как ярлык для где

$doc.xml.Section.BEName | ? { $_.Status -eq 1 }

Выражение внутри фигурных скобок будет оцениваться для каждого XmlElement в конвейер, и будут возвращены только те, у которых есть статус 1. $_ оператор ссылается на текущий объект в конвейере (XmlElement).

Если вам нужно что-то сделать для каждого объекта в вашем конвейере, вы можете объектов в командлет foreach-object, который выполняет блок для каждого объекта в трубопроводе. % - это ярлык для foreach:

$doc.xml.Section.BEName | ? { $_.Status -eq 1 } | % { $_.BE + " is delcious" }

Powershell отлично справляется с этим. Очень легко собрать трубопроводы объектов, фильтров и выполнять операции над каждым объектом в конвейере.

Ответ 2

[xml]$xmlfile = '<xml> <Section name="BackendStatus"> <BEName BE="crust" Status="1" /> <BEName BE="pizza" Status="1" /> <BEName BE="pie" Status="1" /> <BEName BE="bread" Status="1" /> <BEName BE="Kulcha" Status="1" /> <BEName BE="kulfi" Status="1" /> <BEName BE="cheese" Status="1" /> </Section> </xml>'

foreach ($bename in $xmlfile.xml.Section.BEName) {
    if($bename.Status -eq 1){
        #Do something
    }
}