如何在Powershell中删除所有XML子节点但不删除属性

时间:2015-07-19 18:33:14

标签: powershell

由此:

<products id="col">
  <product code="id1" />
  <product code="id2" />
</products>

我想得到这个:

<products id="col">
</products>

如果我使用RemoveAll(),它也会删除产品id属性,所以我会得到这个

<products>
</products>

这不是我想要的。我可以使用什么方法将我的id属性保存在产品节点中?

2 个答案:

答案 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>不包含任何子元素(即,它是文本元素),此代码也有效。