46

我是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 做到这一点?

4

3 回答 3

87

第一步是将您的 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>
'@

Powershell 使得使用点符号解析 xml 变得非常容易。此语句将为您的 BEName 元素生成一系列 XmlElements:

$doc.xml.Section.BEName

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

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

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

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

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

Powershell 在这方面做得很好。组装对象管道、过滤管道以及对管道中的每个对象进行操作真的很容易。

于 2013-08-03T17:52:54.787 回答
29

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

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

使用 PowerShell 解析 XML 文件

于 2014-07-17T05:25:32.403 回答
14
[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
    }
}
于 2013-08-03T11:22:23.223 回答