【问题标题】:How to add a child element for XML in PowerShell如何在 PowerShell 中为 XML 添加子元素
【发布时间】:2013-10-15 05:42:19
【问题描述】:

我正在尝试为此 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'。

【问题讨论】:

  • 这一定是 powershell 中最愚蠢的“怪癖”。
  • 这在 powershell 6 中运行良好。(在 6.2 上测试)

标签: xml powershell


【解决方案1】:

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

  • 如果目标元素为空或仅包含单个文本节点,PS 将返回String
  • 如果目标元素包含文本节点以外的子节点,它将返回XmlElement
  • 如果存在多个目标元素,它将返回一个Object[],其中每个单独的数组元素再次受这些规则的约束,例如根据其内容,它将是 StringXmlElement
  • 如果目标元素不存在,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 方法是更好的方法。

【讨论】:

  • 正确的代码是 $doc = [xml] (Get-Content $filePath) 它不能解决我的问题
  • 我发现如果标签为空,$doc.configuration为String,如果不为空-XmlElement。我已经使用返回 $null 或 XmlElement 的 $doc.SelectSingleNode('configuration') 解决了我的问题。
  • 我讨厌人们试图用他们的软件变得聪明,而他们最终所做的只是让你的生活变得更加困难。
  • 我认为当我尝试附加一个新的子元素时,期望我刚刚迭代其子级并从中删除所述子级的 XmlElement 实例不会将类型突变为下一条语句的字符串是合理的。我不确定我是否理解这种突变带来的便利。
  • 最后两行可以这样合并:$child = $doc.DocumentElement.AppendChild( $doc.CreateElement("newElement") )。这也可以防止 PS 将 AppendChild 的返回值写入输出。
猜你喜欢
  • 2018-12-07
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2012-06-14
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
相关资源
最近更新 更多