为什么错误“System.String不包含名为'AppendChild'的方法”

时间:2015-07-19 12:25:18

标签: powershell

为什么此PowerShell脚本不起作用:

[xml]$xml = '<products></products>'

$newproduct = $xml.CreateElement('product')
$attr = $xml.CreateAttribute('code')
$attr.Value = 'id1'
$newproduct.Attributes.Append($attr)

$products = $xml.products
$products.AppendChild($newproduct)

错误是

Method invocation failed because [System.String] does not contain a method named 'AppendChild'.
At line:1 char:1
+ $products.AppendChild($newproduct)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

如果我更换

$products = $xml.products

通过

$products = $xml.SelectSingleNode('//products')

它会起作用,但我想知道为什么第一种语法不起作用,因为它对我来说是不合逻辑的。 $xml.products应该是有效的XML对象,因此提供方法AppendChild()

2 个答案:

答案 0 :(得分:4)

$xml.products不引用products节点本身,而是引用products节点的内容。由于products为空,因此它将计算为空字符串。

要访问products节点,您还可以使用:

$Products = $xml.FirstChild 
$Products.AppendChild($newproduct)

或更具体地说:

$Products = $xml.FirstChild.Where({$_.Name -eq "products"})
$Products.AppendChild($newproduct) 

但是SelectSingleNode()可能会很好地为你服务

答案 1 :(得分:1)

$xml.configuration.SelectSingleNode("connectionStrings").AppendChild($newnode)

会很好,但有趣的&amp;脏黑客:给出这个空节点:

  <connectionStrings>    
  </connectionStrings>

脚本

$xml.configuration.connectionStrings.AppendChild($newnode)

给出&#34; Method invocation failed because [System.String] does not contain a method named 'AppendChild'&#34;错误

但是这个:

  <connectionStrings>
        <!-- random comment -->
  </connectionStrings>

完美无缺