使用powershell解析xml

使用powershell解析xml,powershell,Powershell,我对powershell是新手。我有一个配置XML,它的内容如下- <xml> <Section name="BackendStatus"> <BEName BE="crust" Status="1" /> <BEName BE="pizza" Status="1" /> <BEName BE="pie" Status="1" /> <BEName BE="b

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

我需要解析
BEName
中的每个元素以检查状态。如何使用PowerShell实现这一点?

[xml]$xmlfile=''
[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
    }
}
foreach($xmlfile.xml.Section.bename中的bename){ if($bename.Status-等式1){ #做点什么 } }
第一步是使用powershell的 将字符串强制转换为[xml]的独特功能

$doc=[xml]@'
'@
Powershell使使用点符号解析xml变得非常容易。这 语句将为BEName元素生成一系列XmlElements:

$doc.xml.Section.BEName
然后,您可以将这些对象导入where-object cmdlet以过滤 结果。你能用吗?作为通往何处的捷径

$doc.xml.Section.BEName |?{$\状态-等式1}
大括号内的表达式将针对 管道,并且只有状态为1的才会返回。$_ 运算符引用管道中的当前对象(XmlElement)

如果需要对管道中的每个对象执行某些操作,可以对 对象导入foreach object cmdlet,该cmdlet为每个对象执行一个块 正在筹备中是foreach的快捷方式:

$doc.xml.Section.BEName |?{$\.Status-eq 1}{$\.BE+“很好吃”}
Powershell在这方面做得很好。这真的很容易组装的管道
对象、筛选管道,并对管道中的每个对象执行操作。

如果要从文件开始,可以执行此操作

[xml]$cn=Get Content config.xml
$cn.xml.Section.BEName

请注意,通过点遍历获取标记将为不包含子标记的任何父标记返回空对象。例如,对于上述示例,
$doc.xml.Section.BEName.BEChild.Length
将为
7
,尽管没有定义BEChild标记。如果您正在筛选,这不会成为问题,但如果您通过
ForEach对象
或类似方式进行迭代,则需要安全地跳过这些空对象。链接已断开:-(