Обновление XMl на основе значений CSV с помощью Powershell - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть CSV-файл со значениями, приведенными ниже:

Age , Status

29 ,    0
41 ,    1
44,     1
27,     0
60,     1

XML выглядит следующим образом:

<office>
  <staff branch="Torrance" Type="Implementation">
    <employee>
        <Name>Raj Parpani</Name>
        <function>Implementation</function>
        <age>29</age>
    </employee>
    <employee>
        <Name>Kevin Woo</Name>
        <function>Consultant</function>
        <age>41</age>
    </employee>
  </staff>
  <staff branch="Irvine" Type="Operations">
   <employee>
    <Name>David Woo</Name>
    <function>Data</function>
    <age>42</age>
   </employee>
   </staff>
 </office>

Если XML возраст равен возрасту в CSV я должен добавить атрибут статуса для этого возраста из CSV сотруднику. Я пробовал код, как показано ниже:

ОРИГИНАЛЬНЫЙ КОД

$csv = Import-Csv 'C:\Users\rparpani\Desktop\test2.csv' | Select-Object "Age","Status"
$xml = New-Object XML
$xml.Load("C:\Users\rparpani\Desktop\test.xml")

$nodes = $xml.SelectNodes("/office/staff/employee")

Foreach($row in $csv)
{
    foreach($node in $nodes)
    {

    if($node.age -eq  $row.age)
    {
    $node.SetAttribute("status", $row.Status);
    }


    }

}

Может кто-нибудь, пожалуйста, подскажите, как изменить это, чтобы сделать то, что я хочу, чтобы он делал


Модифицированный код

    $csv = Import-Csv 'C:\Users\rparpani\Desktop\test2.csv' | Select-Object "Age","Status"
    $xml = New-Object XML
    $xml.Load("C:\Users\rparpani\Desktop\test.xml")

    $nodes = $xml.SelectNodes("/office/staff/employee")


    foreach($row in $csv) {
      foreach($node in $nodes) {
        if ($node.age -eq $row.age) {
          if ($node.status) {
            $node.status.innerText = $row.Status
          }
          else {
            $status = $xml.CreateNode("element", "status", "")
            $status.InnerText = $row.status
            $node.AppendChild($status)
          }
        }
      }
    }

    $xml.Save("C:\Users\rparpani\Desktop\test.xml")

1 Ответ

1 голос
/ 14 февраля 2020

Следующий код делает то, что вы ищете.

  1. Вы не можете использовать SetAttribute для создания нового элемента со значением / InnerText. Вам нужно создать элемент и добавить его к узлу, на котором вы находитесь. В вашем примере xml, staff имеет два атрибута, branch и Type, которые можно обновить с помощью метода SetAttribute.
  2. Если Status уже существует, обновите его с новым значением .. в противном случае создать новый элемент.

CSV-контент

Age,Status
29,0
41,1
44,1
27,0
60,1

Скрипт для добавления атрибута в узел `Employee

foreach($row in $csv) {
  foreach($node in $nodes) {
    if ($node.age -eq $row.age) {
      if ($row.status -eq "0") {
        $node.SetAttribute("status", "Hired")
      }
      else {
        $node.SetAttribute("status", "Fired")
      }
    }
  }
}

...