在同一XML中查询多个XML属性

时间:2016-10-13 15:36:50

标签: xml powershell

我有我正在查询的XML文档。从下面的示例XML中,$Match = TRUE当USER有密码时,AND STATUS =“a”和ACTION =“h”。这些都在相同的XML中。

<BusinessUnitList>
  <User id="1407210" loginName="1407210" password="Password1" statusCode="a">


<WorkStatusList>
  <WorkStatus start="2016-10-13" status="a" action="h" /> 

我可以查询一个或另一个属性:

$Match = (gc "c:\file.xml | Select-Xml -XPATH "//User" | select -ExpandProperty node | where {$_.password})
$Match2 = (gc "c:\file.xml | Select-Xml -XPATH "//WorkStatus" | select -ExpandProperty node | where {$_.status -eq "a" -and $_.action -eq "h"}

但我不知道如何将两者结合起来,以便当所有三个值存在和/或存在时条件仅为TRUE。

我尝试将脚本与-and合并,但无济于事。

$Match = (gc "c:\file.xml | Select-Xml -XPath "//User" | select -ExpandProperty node | where {$_.password}) -and
         (gc "c:\file.xml | Select-Xml -XPath "//WorkStatus" | select -ExpandProperty node | where {$_.status -eq "a" -and $_.action -eq "h"})

1 个答案:

答案 0 :(得分:0)

我喜欢将文档读入XML对象以开始。这样您就不必多次迭代文件。然后,您可以在SelectNodes()函数内部使用XPath表达式。只需-and两个不同的SelectNode()来电,即可获得结果。像这样:

$xml = [XML] (gc c:\file.xml)
$Match = $xml.SelectNodes("//WorkStatus[@status='a'and @action='h']").Count -gt 0 -and $xml.SelectNodes("//User[@password]").Count -gt 0