Powershell - 在多个位置添加一个xml节点

时间:2015-11-08 12:01:43

标签: xml powershell

我最近开始学习powershell来更改XML文件。现在我在特定位置添加新节点时遇到了麻烦。 我创建了一个xml节点 <Name2>Reference</Name2> 并希望将其插入一个<VFI>节点内的每个<customer>节点中。

XML文件:

<WartbareEinheitenListe>
 <WartbareEinheit>
  <Name>John Wayne</Name>
  <Typ>STRUKTUR</Typ>
  <Customer>100008</Customer>
  <WartbareEinheiten>
   <WartbareEinheit>
    <Name>Wohnhaus</Name>
    <Typ>OBJECT</Typ>
    <Customer>100008</Customer>
    <VIF>                                     <---- Insert here
     <InfoFeld>
      <Name>Nummer</Name>
      <InfoFeldTyp>DECIMAL</InfoFeldTyp>
       <Inhalt>
        <Nummer>4500514</Nummer>
       </Inhalt>
     </InfoFeld>
    </VIF>
  </WartbareEinheit>
  <WartbareEinheit>
   <Name>John Wayne</Name>
   <Typ>OBJECT</Typ>
   <Customer>100008</Customer>
    <VIF>                                    <---- Insert here
     <InfoFeld>
      <Name>Nummer</Name>
      <InfoFeldTyp>DECIMAL</InfoFeldTyp>
      <Inhalt>
       <Nummer>5002449</Nummer>
      </Inhalt>
     </InfoFeld>
    </VIF>
   </WartbareEinheit>
  </WartbareEinheiten>
 </WartbareEinheit>
</WartbareEinheitenListe>

我的代码:

$Path = "$env:....\Desktop\xmlpath.xml"

$xml = New-Object -TypeName XML
$xml.Load($Path)

$AlOb = $xml.WartbareEinheitenListe.WartbareEinheit.WartbareEinheiten.WartbareEinheit | Where-Object {$_.Customer -eq "100008"}

$AlOb2 = $AlOb.SelectSingleNode("VIF")
$R = $AlOb | Where-Object {$_.Typ -eq "OBJECT"}
$E = $R.Typ

for ( $i=0 ; $i -lt $E.count; $i++) {

$InfoFeld = $xml.CreateElement("InfoFeld")

$Mandant = $xml.CreateElement("Name2")
$MandantInhalt = $xml.CreateTextNode("Reference")
$Mandant.AppendChild($MandantInhalt)

$InfoFeld.AppendChild($Mandant)

$AlOb2.InsertAfter($InfoFeld,$AlOb.Node.VIF)
}
$NewPath = "$env:....Desktop\xmlpath2.xml"
$xml.Save($NewPath)

结果是我为每个VIF获得了两个新元素,这是正确的,但是我的代码在最后一个VIF节点中插入了两个元素。

我的错误?

2 个答案:

答案 0 :(得分:0)

我想我自己解决了这个问题:

我尝试了一些数组,现在它可以工作了。

数组代码:

InsertAfter的代码:

$Array = @($AlOb2)

祝大家周日愉快

Q

答案 1 :(得分:0)

您可以使用SelectNodes()方法选择所有<VIF>个节点:

$VIFNodes = $xml.SelectNodes('/WartbareEinheitenListe/WartbareEinheit/WartbareEinheiten/WartbareEinheit/VIF')

然后使用<Name2>

将新的AppendChild元素添加到其中
foreach($VIFNode in $VIFNodes){
    $Name2Node = $xml.CreateElement("Name2")
    $Name2Node.InnerText = "Reference"
    $VIFNode.AppendChild($Name2Node) | Out-Null
}
$NewPath = "$env:....Desktop\xmlpath2.xml"
$xml.Save($NewPath)