【问题标题】:Simple way to copy node from existing XML-File to New XML-File将节点从现有 XML 文件复制到新 XML 文件的简单方法
【发布时间】:2019-07-31 05:41:55
【问题描述】:

我有一个现有的(源)XML 文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Base>
  <Meta>
    <Element>Value</Element>
  </Meta>
  <Settings>
    <Hostname>Computer01</Hostname>
  </Settings>
  <Data>
    <Element>Value</Element>
  </Data>
</Base>

我使用以下 PowerShell 代码将此 XML 文件导入变量“$Xml”:

$Xml = New-Object -TypeName System.Xml.XmlDocument ; $Xml.Load( $PathToXml )

我想将 &lt;Settings&gt; 节点(+children)从 $Xml 导出/保存到一个新的 XML 文件,该文件尚不存在。

对于本示例,新的目标 XML 文件应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Base>
  <Settings>
    <Hostname>Computer01</Hostname>
  </Settings>
</Base>

我的临时解决方案是复制整个 source-xml 并选择并删除不需要的节点,但这不是一个干净的解决方案。我还尝试从头开始构建一个新的 XML,但这使用了大量的代码,我相信有一种更简洁的方法来完成这项任务。

提前谢谢你

【问题讨论】:

    标签: powershell


    【解决方案1】:

    如果您可以使用 XPath 语法,以下内容将满足您的需求。

    $xml = [xml](Get-Content source.xml)
    $Nodes = $xml.SelectNodes('Base/*[name() != "Settings"]')
    foreach ($Node in $Nodes) {
        [void]$xml.Base.RemoveChild($Node)
    }
    $xml.Save("c:\temp\destination.xml")
    

    另一种方法,依靠where() 方法来查找要删除的节点名称,如下所示。

    $xml = [xml](Get-Content source.xml)
    $NodesToRemove = $xml.Base.ChildNodes.Name.where{$_ -ne 'Settings'}
    foreach ($NodeName in $NodesToRemove) {
        $node = $xml.Base.SelectSingleNode($NodeName)
        [void]$xml.Base.RemoveChild($node)
    }
    $xml.Save("c:\temp\destination.xml")
    

    说明:

    $xml 使用[xml] 类型加速器将 XML 内容存储为 XmlDocument 类型。 $NodesToRemove 是一个数组,其中包含未命名为 Settings 的 Base 的所有子节点的名称。然后找到与数组中的名称匹配的节点并随后将其删除。 Save() 用于存储更新后的 XML 内容。

    【讨论】:

    • 我就是这样实现的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2012-11-27
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多