52

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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
</configuration>

我使用这个 PowerShell 脚本:

[xml] $doc = Get-Content($filePath)
$child = $doc.CreateElement("newElement")
$doc.configuration.AppendChild($child)

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

4

1 回答 1

84

如果您使用点符号来导航 XML 文件(例如$doc.configuration),Powershell 会尝试巧妙地处理它返回的内容。

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

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

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

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


有人可能会争论这种行为的敏感性,但事实上,它使得使用(结构合理的)XML 变得非常简单——例如从配置文件或 API 响应中读取值等任务。这就是这个简单语法的目的。

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

于 2013-10-08T10:39:31.190 回答