用于删除XML元素的PowerShell脚本

Har*_*vey 4 xml powershell xpath

我有一个XML文档,如下所示:

<Task>
    <Settings>
    </Settings>
    <Sub>foo</Sub>
    <Body>bar</Body>
</Task>
Run Code Online (Sandbox Code Playgroud)

从PowerShell我可以愉快地使用以下内容获取'Sub'和'Body'的内容:

$Body = $XMLFile.Task.Body
Run Code Online (Sandbox Code Playgroud)

但我试图完全删除'Sub'和'Body'标签,因此XML将是:

<Task>
    <Settings>
    </Settings>
</Task>
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多东西,包括:

  • 使用该.RemoveChild()方法(抛出与Object引用相关的exeption)
  • 使用XPath语句删除并添加管道以在一行中删除
  • 甚至将文件作为文本文件打开并尝试:

    Get-Content $_.FullName -notmatch "<Sub>" | out-file $_.FullName

^^这什么都不做

此外,对于此脚本应用程序,我将无法使用任何第三方模块

Mat*_*sen 7

您可以使用它Where-Object来查找要删除的子节点,然后调用RemoveChild():

$Input = "C:\path\task.xml"
$Output = "C:\path\newtask.xml"

# Load the existing document
$Doc = [xml](Get-Content $Input)

# Specify tag names to delete and then find them
$DeleteNames = "Sub","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)
Run Code Online (Sandbox Code Playgroud)