使用powershell解析xml

haa*_*ram 29 powershell

我是PowerShell的新手.我有一个配置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>
Run Code Online (Sandbox Code Playgroud)

我需要解析每个元素BEName以检查状态.如何使用PowerShell完成此操作?

Mar*_*eld 57

第一步是将xml字符串加载到XmlDocument中,使用powershell将字符串强制转换为[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>
'@
Run Code Online (Sandbox Code Playgroud)

Powershell使用点表示法很容易解析xml.该语句将为您的BEName元素生成一系列XmlElements:

$doc.xml.Section.BEName
Run Code Online (Sandbox Code Playgroud)

然后,您可以将这些对象传递到where-object cmdlet以过滤结果.您可以使用 ?作为哪里的捷径

$doc.xml.Section.BEName | ? { $_.Status -eq 1 }
Run Code Online (Sandbox Code Playgroud)

将为管道中的每个XmlElement计算大括号内的表达式,并且仅返回状态为1的那些表达式.$ _运算符引用管道中的当前对象(XmlElement).

如果需要为管道中的每个对象执行某些操作,可以将对象传递到foreach-object cmdlet,该cmdlet为管道中的每个对象执行一个块.%是foreach的快捷方式:

$doc.xml.Section.BEName | ? { $_.Status -eq 1 } | % { $_.BE + " is delicious" }
Run Code Online (Sandbox Code Playgroud)

Powershell非常擅长这些东西.组装对象的管道,过滤管道以及对管道中的每个对象执行操作非常容易.

  • 请注意,通过 dot-walking 获取标签将为任何不包含子标签的父标签返回空对象。例如,尽管没有定义 BEChild 标签,但对于上面的例子,`$doc.xml.Section.BEName.BEChild.Length` 将是 `7`。如果您正在过滤,这不会成为问题,但是如果您通过 `ForEach-Object` 或类似方法进行迭代,则需要安全地跳过这些空对象。 (3认同)

小智 20

如果你想从一个文件开始,你可以这样做

[xml]$cn = Get-Content config.xml
$cn.xml.Section.BEName
Run Code Online (Sandbox Code Playgroud)

使用PowerShell解析XML文件

  • 链接已损坏:-( (2认同)

Wad*_*e73 11

[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
    }
}
Run Code Online (Sandbox Code Playgroud)