如何在PowerShell中为XML添加子元素

War*_*ock 45 xml powershell

我正在尝试为此xml创建一个子XML元素:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我使用这个PowerShell脚本:

[xml] $doc = Get-Content($filePath)
$child = $doc.CreateElement("newElement")
$doc.configuration.AppendChild($child)
Run Code Online (Sandbox Code Playgroud)

我有一个错误: 方法调用失败,因为[System.String]不包含名为'AppendChild'的方法.

Tom*_*lak 63

如果使用点表示法来导航XML文件(例如$doc.configuration),Powershell会尝试巧妙地返回它返回的内容.

  • 如果目标元素为空或仅包含单个文本节点,则PS将返回a String.
  • 如果目标元素包含除文本节点之外的子节点,则它将返回一个XmlElement.
  • 如果存在多个目标元素,则它将返回一个Object[],其中每个单独的数组元素再次受这些规则约束,例如,它将是a StringXmlElement取决于其内容.
  • 如果目标元素不存在,则PS返回$null.

在您的情况下,它很容易,因为您想要将节点附加到文档元素:

$doc = New-Object System.Xml.XmlDocument
$doc.Load($filePath)
$child = $doc.CreateElement("newElement")
$doc.DocumentElement.AppendChild($child)
Run Code Online (Sandbox Code Playgroud)

但您可以使用$doc.SelectNodes()$doc.SelectSingleNode()浏览XML文档并始终返回节点/节点列表.


人们可以争论这种行为的敏感性,但实际上它使消费(结构良好的)XML非常直接 - 例如从配置文件或API响应中读取值等任务.这就是这种简单语法的目的.

它不是创建 XML 的好工具,这是一项更复杂的任务.从一开始就使用DOM API方法是更好的方法.

  • 当人们试图聪明地使用他们的软件时,我讨厌它,他们最终做的就是让你的生活变得更加艰难. (11认同)
  • 我认为合理的是,当我尝试添加新的子元素时,我只是迭代了XmlElement实例并从中删除的XmlElement实例不会为下一条语句将类型突变为String的字符串。我不确定我是否了解这种突变带来的便利。 (3认同)
  • 我发现如果<configuration>标记为空,$ doc.configuration是String,如果不为空 - XmlElement.我使用返回$ null或XmlElement的$ doc.SelectSingleNode('configuration')解决了我的问题. (2认同)
  • 最后两行可以这样计算:`$child = $doc.DocumentElement.AppendChild( $doc.CreateElement("newElement") )`。这也防止 PS 将 `AppendChild` 的返回值写入输出。 (2认同)