为什么此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()
。
答案 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>
完美无缺