Сравните два элемента xml одного и того же родительского узла в powershell - PullRequest
1 голос
/ 06 июля 2019
<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 ]

4 голосов
/ 06 июля 2019

Если вы хотите использовать Select-Xml, вы можете сделать следующее:

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

См. Примеры XPath для примеров выражений xpath.См. логические выражения, выражения сравнения и множества для получения дополнительной информации об операторах XPath, включая экранирование < и >, где это необходимо.

0 голосов
/ 06 июля 2019

В вашем примере $ _. 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
0 голосов
/ 06 июля 2019

Я бы использовал анализатор 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}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...