在XML文档的中间添加XML元素

时间:2016-10-11 04:35:39

标签: xml powershell

我正在编写PowerShell脚本来修改XML文件。我需要添加一个新元素并为其添加属性。我尝试使用CreateElement()AppendChild()方法,但它没有帮助。下面是我的示例输入XML文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Subnet xmlns="http://google.com">
  <Id>Network_106</Id>
  <Name>Network_106</Name>
  <Description>
  </Description>
  <NetworkAddress>173.24.106.0</NetworkAddress>
  <NetworkMask>255.255.255.0</NetworkMask>
</Subnet>

我需要在下面的描述之后添加名为DeliveryServices的新elemetnt,并在其中添加Id元素。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Subnet xmlns="http://google.com">
  <Id>Network_106</Id>
  <Name>Network_106</Name>
  <Description>
  </Description>
<DeleveryServices>
  <Id>172.22.22.22</Id>
</DeleveryServices>
  <NetworkAddress>173.24.106.0</NetworkAddress>
  <NetworkMask>255.255.255.0</NetworkMask>
</Subnet>

我尝试了下面的代码,但它不起作用。

[xml]$xdoc = Get-Content "F:\Sample.xml"
$child = $xdoc.CreateElement("DeleveryServices")
$xdoc.Subnet.AppendChild($child)
$xdoc.Subnet.DeleveryServices.Id = "172.22.22.22"

我收到以下错误。此外,还在XML文件的末尾创建了DeleveryServices元素。在描述之后我想要它。

The property 'Id' cannot be found on this object. Verify that the property
exists and can be set.
At line:44 char:17
+                 $xdoc.Subnet.DeleveryServices.Id = "172.22.22.22"

2 个答案:

答案 0 :(得分:0)

$child = $xdoc.CreateElement("DeleveryServices")
                              ^^^^^^^^^^^^^^^^
$xdoc.Subnet.AppendChild($child)
$xdoc.Subnet.DeliveryServices.Id = "172.22.22.22"
             ^^^^^^^^^^^^^^^^

请注意DeleveryServices!= DeliveryServices

答案 1 :(得分:0)

您创建了一个节点<DeleveryService>,但这只会创建一个空节点。它没有神奇地创建,添加或填充子节点<Id>。你需要自己做:

[xml]$xdoc = Get-Content "F:\Sample.xml"
$child = $xdoc.CreateElement("DeleveryServices")

$id = $xdoc.CreateElement("Id")
$id.InnerText = '172.22.22.22'
$child.AppendChild($id)

$xdoc.Subnet.AppendChild($child)

要在特定的其他节点之后添加新节点,您需要使用InsertAfter()而不是AppendChild(),这显然会将节点放在最后(&#34;追加&#34;)。< / p>

$nsm = New-Object Xml.XmlNamespaceManager($xdoc.NameTable)
$nsm.AddNamespace('ns', $xdoc.DocumentElement.NamespaceURI)

$descr = $xdoc.SelectSingleNode('//ns:Description', $nsm)

$xdoc.Subnet.InsertAfter($child, $descr)

请注意,您需要一个命名空间管理器来选择Description节点,因为您的XML数据使用命名空间。