我最近开始学习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节点中插入了两个元素。
我的错误?
答案 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)