【问题标题】:Add a XML element in the middle of the XML document在 XML 文档中间添加一个 XML 元素
【发布时间】:2016-10-11 04:35:39
【问题描述】:

我正在编写 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 的新元素,并在其中添加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"

我收到以下错误。并且DeleveryServices 元素也在 XML 文件的末尾创建。我想要它在描述之后。

在此对象上找不到属性“Id”。验证该属性
存在并且可以设置。
在行:44 字符:17
+ $xdoc.Subnet.DelevyServices.Id = "172.22.22.22"

【问题讨论】:

  • “它不起作用” 是不够的。解释发生了什么,显示实际输出,并包含任何错误消息。
  • @JimGarrison 添加了错误详情。
  • 我在 XML 的任何地方都看不到 &lt;DeploymentServices&gt; 节点。您不能在不存在的节点上设置属性。
  • 我需要创建一个名为“DeliveryServices”的新节点..对不起我的错误..编辑了问题@JimGarrison
  • 呃,根据您发布的示例,Id 是一个元素,而不是一个属性。显然你应该像其他元素一样创建它。

标签: xml powershell


【解决方案1】:

您创建了一个节点&lt;DeleveryService&gt;,但这只会创建一个空节点。它不会神奇地创建、添加或填充子节点&lt;Id&gt;。你需要自己做:

[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(),这显然将节点放在末尾(“附加”)。

$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 数据使用命名空间。

【讨论】:

    【解决方案2】:
    $child = $xdoc.CreateElement("DeleveryServices")
                                  ^^^^^^^^^^^^^^^^
    $xdoc.Subnet.AppendChild($child)
    $xdoc.Subnet.DeliveryServices.Id = "172.22.22.22"
                 ^^^^^^^^^^^^^^^^
    

    注意DeleveryServices != DeliveryServices

    【讨论】:

    • 这是一个错字。仍然无法正常工作。显示相同的错误。
    • $child.Id = "172.22.22.22"怎么样
    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多