Powershell删除XML标记

时间:2016-09-05 07:45:45

标签: xml powershell

我是PowerShell的新手,正在尝试从我的xml XML文件中删除XML元素。

为此,我使用了以下来自Adding and Removing Xmlnode using Powershell

的示例代码

该示例效果很好,但是当我尝试将其用于我的代码时,它不再有效。代码如下:

$Output = "C:\Users\Desktop\resulttest.xml"
# Load the existing document
$Doc = [xml](Get-Content -Path C:\Users\Desktop\test.xml)

# Specify tag names to delete and then find them
$DeleteNames= "body"
($Doc.Task.ChildNodes | Where-Object { $DeleteNames -contains $_.Name }) | ForEach-Object {
    # Remove each node from its parent
    [void]$_.ParentNode.RemoveChild($_)
}
# Save the modified document
$Doc.Save($Output)

我使用以下示例XML文件:

<html>a
<body>b</body>
<Price>300</Price>
<Total> 5000 </Total>
 <Part_C>
 <Name>Jar</Name>
<Title>Mr</Title>
<CountryCode> 5000 </CountryCode>
</Part_C>
</html>

XML文件的目标是删除多个标签,如&#34; Price&#34;和&#34; Total&#34;或&#34; Price&#34;,&#34; Title&#34;,&#34; Total&#34;

但是当我运行代码时,它仍然包含这些标记。

我的问题是我做错了什么以及如何确保PowerShell删除XML标记?

2 个答案:

答案 0 :(得分:1)

这完美无缺。

$Output = "resulttest.xml"
$Doc = [xml]"<task><body>b</body><bla>bla</bla></task>"

$DeleteNames = "body"

$Doc.Task.ChildNodes | Where-Object { $DeleteNames -eq $_.Name } | ForEach-Object {
    $_.ParentNode.RemoveChild($_) | Out-Null
}

$Doc.Save($Output)

我的猜测是$Doc.Task实际上没有在XML文档中选择任何内容。

答案 1 :(得分:0)

如果不深入研究,我认为问题可能是您没有对$Doc元素本身进行操作。我直接在其上使用XML方法SelectNodes

$Doc.ChildNodes.SelectNodes($DeleteNames) | Foreach-Object {
    $Doc.ChildNodes.RemoveChild($_)
}
$Doc.Save($Output)

<强>更新 如果$DeleteNames包含多个条件/节点,则需要将其作为一个数组并为每个条件调用一次代码(SelectNodes不支持模式):

,"Price","Total" | Foreach-Object { 
    $Doc.ChildNodes.SelectNodes($_) | Foreach-Object {
...

我想你可以使用例如选择备用节点进行选择。 XPath,但我还没有深入研究它。