2013-08-03 18 views
15

Jestem nowy w powershell. Mam XML config, który brzmi jak -Parsowanie xml przy użyciu powłoki Shell

<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> 

muszę analizować każdy element w BEName aby sprawdzić stan. Jak to zrobić za pomocą PowerShell?

Odpowiedz

38

Pierwszym krokiem jest, aby załadować swój ciąg XML do XmlDocument przy użyciu PowerShell za unikalną zdolność do oddania ciągi do [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 sprawia, że ​​naprawdę łatwe do analizowania xml z notacją kropka . Ten oświadczenie będzie produkować sekwencję XmlElements dla elementów BEName:

$doc.xml.Section.BEName 

Następnie można rura te obiekty do cmdletu gdzie-obiektowego filtrować dół wyników. Możesz użyć ? jako skrót dla gdzie

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

Wyrażenie wewnątrz klamrowych być obliczane dla każdego XmlElement w rurociągu, i tylko te, które mają stan 1 jest zwracany. Operator $ _ odnosi się do bieżącego obiektu w potoku (XmlElement).

Jeśli chcesz coś zrobić dla każdego obiektu w potoku, możesz przepuścić obiekty do polecenia cmdlet foreach-object, co powoduje wykonanie bloku dla każdego obiektu w rurociągu o numerze . % to skrót do foreach:

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

Powershell jest świetny w tym zakresie. Naprawdę łatwo jest zmontować rurociągi z obiektów , filtrować rurociągi i wykonywać operacje na każdym obiekcie w rurociągu.

9
[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 
    } 
}