比较Powershell中同一父节点的两个xml元素

时间:2019-07-06 11:23:04

标签: xml powershell

<department>
    <employee name="ABC">
    <salary value="basic">5000</salary>
    <salary value="allowance">8000</salary>
    </employee>
    <employee name="XYZ">
    <salary value="basic">6000</salary>
    <salary value="allowance">3000</salary>
    </employee>
    </department>

在Powershell中如何获得津贴额大于基本津贴的雇员姓名。

我在下面尝试过,但没有给出结果

$result= $xml |Select-Xml '//department'| 
ForEach{
$basic=$_.Node.employee.salary.value | where {$_.Node.employee.salary.value -eq 'basic'}
$allowance=$_.Node.employee.salary.value | where {$_.Node.employee.salary.value -eq 'allowance'}
if ($allowance -ge $basic)
{
$name=$_.Node.employee.name
}
}
echo $result

3 个答案:

答案 0 :(得分:4)

如果要使用Select-Xml,则可以执行以下操作:

$node = $xml | Select-Xml -XPath "//department/employee[./salary[@value='basic'] < ./salary[@value='allowance']]"
$node.node.name # Output the employee name

有关xpath表达式示例,请参见XPath Examples。有关XPath运算符的更多信息,包括<>的转义,请参见Boolean, Comparison, and Set Expressions

答案 1 :(得分:0)

我将使用PowerShell XML解析器([XML])创建XMLDocument:

$xml = [XML]'
    <department>
        <employee name="ABC">
            <salary value="basic">5000</salary>
            <salary value="allowance">8000</salary>
        </employee>
        <employee name="XYZ">
            <salary value="basic">6000</salary>
            <salary value="allowance">3000</salary>
        </employee>
    </department>'

然后就这么简单:

$xml.Department.Employee | % {
    $allowance = [Int]($_.salary | ? {$_.value -eq 'allowance'}).'#text'
    $basic = [Int]($_.salary | ? {$_.value -eq 'basic'}).'#text'
    If ($allowance -ge $basic) {$Name = $_.name}
}

答案 2 :(得分:0)

在您的示例中,$ _。Node.employee.salary.value只是一个字符串数组,因此cmd不能引用任何属性,而$ basic和$ allowance最终为空白。另外,因为只有一个部门,所以foreach只循环一次。

这样,您已经在招募一系列员工,而不是一个部门。我也将节点属性弄乱了。 $ basic和$ allowance仍然是具有value和#text属性的对象。我输出匹配的雇员对象。这有点像您要尝试做的。比较必须为[int],否则'500'大于'4000'。

(Select-Xml /department/employee salary.xml).node |
ForEach {
  $basic = $_.salary | where value -eq basic
  $allowance = $_.salary | where value -eq allowance
  if([int]$allowance.'#text' -ge $basic.'#text') {
    $_ | select name, 
      @{n='basic'; e={$basic.'#text'}}, 
      @{n='allowance'; e={$allowance.'#text'}} 
  }
}


name basic allowance
---- ----- ---------
ABC  5000  8000
相关问题