如何删除PowerShell中的所有XML子节点而不是属性

busg9geu  于 2023-04-06  发布在  Shell
关注(0)|答案(3)|浏览(156)

从这里:

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

我想得到这个:

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

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

<products>
</products>

这不是我想要的。我可以使用什么方法来保留products节点中的id属性?

6tqwzwtp

6tqwzwtp1#

不需要调用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::*')
ezykj2lf

ezykj2lf2#

我的答案并不依赖于XPath来实现这一点,脚本假定$XmlDocument是一个包含XmlDocument示例的变量,脚本还假定只有<product>元素存在于<products>中。

if ($XmlDocument.products -is [Xml.XmlElement]) {
    $XmlDocument.products.product | %{ $_.ParentNode.RemoveChild($_) | Out-Null }
}

如果<products>不包含任何子元素(即,它是一个文本元素),此代码也可以工作。

k10s72fa

k10s72fa3#

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

我想知道如果我想通过父节点属性id删除子节点,我应该怎么做?

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

相关问题