由此:
<products id="col">
<product code="id1" />
<product code="id2" />
</products>
我想得到这个:
<products id="col">
</products>
如果我使用RemoveAll(),它也会删除产品id属性,所以我会得到这个
<products>
</products>
这不是我想要的。我可以使用什么方法将我的id属性保存在产品节点中?
答案 0 :(得分:5)
您需要找到要删除的节点,然后使用RemoveAll()
手动删除每个节点,而不是调用RemoveChild()
:
$XmlDocument = [xml]@'
<products id="col">
<product code="id1" />
<product code="id2" />
</products>
'@
$ChildNodes = $XmlDocument.SelectNodes('//product')
foreach($Child in $ChildNodes){
[void]$Child.ParentNode.RemoveChild($Child)
}
$XmlDocument.Save("C:\path\to\doc.xml")
如果您不知道直接子节点的名称,但只知道父节点名称,则可以使用XPath来选择它们:'//ParentNodeName/child::*'
$ChildNodes = $XmlDocument.SelectNodes('//products/child::*')
答案 1 :(得分:3)
我的回答并不依赖于XPath来实现这一目标。该脚本假定$XmlDocument
是包含XmlDocument
实例的变量。该脚本还假定<product>
内只有<products>
个元素。
if ($XmlDocument.products -is [Xml.XmlElement]) {
$XmlDocument.products.product | %{ $_.ParentNode.RemoveChild($_) | Out-Null }
}
如果<products>
不包含任何子元素(即,它是文本元素),此代码也有效。