xml - 删除 XML 文件中的子节点

标签 xml powershell namespaces

假设我有这个 XML:

    <?xml version="1.0" encoding="utf-16"?>
    <GPO xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.microsoft.com/GroupPolicy/Settings">
      <Identifier>
        <Identifier xmlns="http://www.microsoft.com/GroupPolicy/Types">{0afca021-554a-49cf-adab-2b6241895145}</Identifier>
      </Identifier>
      <Name>DefaultName</Name>
      <IncludeComments>true</IncludeComments>
      <CreatedTime>2012-08-08T18:20:05</CreatedTime>
      <ModifiedTime>2018-09-05T20:23:59</ModifiedTime>
      <ReadTime>2018-09-19T11:02:17.4750654Z</ReadTime>
     </GPO>

使用 PowerShell,如何删除 CreatedTime 和 ModifiedTime 节点?

让我失望的是 GPO 元素的命名空间问题。

这是我到目前为止所拥有的:
[xml]$xml = Get-Content "C:\temp\x.xml"
$parent_xpath = '//GPO'
$nodes = $xml.SelectNodes($parent_xpath)
$nodes
$nodes | % {
        $child_node = $_.SelectSingleNode('CreatedTime')
        $_.RemoveChild($child_node) | Out-Null
}
 $xml.Save("C:\temp\x-2.xml")
exit

最佳答案

您可以调用父节点,循环遍历每个子节点,然后从父节点中删除。您可以使用“Node.ChildNode.ChildNode”来定义父级

为你写了一个快速函数

function Remove-ChildNodes([xml]$FullXML, [string]$ParentNode, [string[]]$NodeNames){
    return ($xml.$ParentNode.ChildNodes | ?{ $NodeNames -contains $_.Name }) | %{[void]$_.ParentNode.RemoveChild($_)}
}

这是一个工作副本
[xml]$xml=@"
<?xml version="1.0" encoding="utf-16"?>
    <GPO xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.microsoft.com/GroupPolicy/Settings">
      <Identifier>
        <Identifier xmlns="http://www.microsoft.com/GroupPolicy/Types">{0afca021-554a-49cf-adab-2b6241895145}</Identifier>
      </Identifier>
      <Name>DefaultName</Name>
      <IncludeComments>true</IncludeComments>
      <CreatedTime>2012-08-08T18:20:05</CreatedTime>
      <ModifiedTime>2018-09-05T20:23:59</ModifiedTime>
      <ReadTime>2018-09-19T11:02:17.4750654Z</ReadTime>
     </GPO>
"@

function Remove-ChildNodes([xml]$FullXML, [string]$ParentNode, [string[]]$NodeNames){
    return ($xml.$ParentNode.ChildNodes | ?{ $NodeNames -contains $_.Name }) | %{[void]$_.ParentNode.RemoveChild($_)}
}

Remove-ChildNodes -FullXML $xml -ParentNode "GPO" -NodeNames "CreatedTime","ModifiedTime"
$xml.InnerXml

关于xml - 删除 XML 文件中的子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52428193/

相关文章:

wpf - xmlns ="http://schemas..."的意义是什么?它需要互联网接入吗?

PHP 命名空间 - 如果声明 Parent\Child,为什么我必须 "use {Parent}"?

javascript - 第 39 行第 26 列错误 : Namespace prefix xlink for href on script is not defined

java - 从 sax validator 获取更多信息

powershell - Powershell远程安装应用程序

powershell - 为什么 -replace 没有按预期工作?

sql-server - sp_xml_preparedocument 和 Namespace 的使用。我在 SQL Server 2012 中收到错误 "XML parsing error: Reference to undeclared namespace prefix: ' a'。

java - “HTML 属性不可序列化”异常 (java)

objective-c - 如何获取 XML 节点的属性名称 - GDataXMLNode

git - 同步到远程仓库时git push的问题