将 XmlDocument 中的节点集替换为另一个 XmlDocument 文件

本文关键字:XmlDocument 另一个 文件 替换 节点 点集 | 更新日期: 2023-09-27 18:32:37

我想知道执行以下操作的最佳方法是什么:

目录"输入.xml"和"元数据.xml"中有 2 个 XML 文件。

输入.xml:

<Root>
  <Header>
    <ID>1</ID>
    <Name>Test</Name>
  </Header>
  <Body>
    <MetaDataSet>
        <ID>23568</ID>
        <Value>metadatavalue1</Value>
    </MetaDataSet>
  </Body>
</Root>

元数据.xml:

<MetaDataSet>
   <metadatasetvalue>Test</metadatasetvalue>
   <Valid>true</Valid>
</MetaDataSet>

我想做的是能够将"输入.xml"的节点集"MetaDataSet"替换为文件"元数据.xml"的全部内容。因此,生成的输出将是:

<Root>
  <Header>
    <ID>1</ID>
    <Name>Test</Name>
  </Header>
  <Body>
    <MetaDataSet>
        <metadatasetvalue>Test</metadatasetvalue>
        <Valid>true</Valid>
    </MetaDataSet>
  </Body>
</Root>

是否可以在 c# 中将节点集替换为 XmlDocument?

将 XmlDocument 中的节点集替换为另一个 XmlDocument 文件

你可以读取两个 XmlDocument 类中的两个 Xml 文档,调用 SelectSingleNode,然后将找到的元素的 InnerXml 替换为元 DocumentElement 的 OuterXml,如下所示:

var i = @"
     <Root>
      <Header>
        <ID>1</ID>
        <Name>Test</Name>
      </Header>
      <Body>
        <MetaDataSet>
            <ID>23568</ID>
            <Value>metadatavalue1</Value>
        </MetaDataSet>
      </Body>
    </Root>";
      var m = @"
      <MetaDataSet>
       <metadatasetvalue>Test</metadatasetvalue>
       <Valid>true</Valid>
    </MetaDataSet>
      ";
  var input2 = new XmlDocument();
  input2.Load(new StringReader(i));
  var meta2 = new XmlDocument();
  meta2.Load(new StringReader(m));
  var body2 = input2.DocumentElement["Body"]; 
  body2.InnerXml = meta2.DocumentElement.OuterXml;
  // helper to show the result
  sb = new StringBuilder();
  using(var xw = XmlWriter.Create(sb)) {
     input2.Save(xw);
  }
  sb.Dump("2");

如果您愿意更改为 XDocument 类,则可以在元素上使用 ReplaceNodes:

  var inDoc = XDocument.Parse(i);
  var metaDoc = XDocument.Parse(m);
  var body = inDoc.Root.Element("Body");
  body.ReplaceNodes(metaDoc.Root);
  // helper to show the result     
  var sb = new StringBuilder();
  using(var xw = XmlWriter.Create(sb)) 
  {
     inDoc.WriteTo(xw);
  }
  sb.Dump(); // LinqPad helper

也可以将 ReplaceWith 和 XPath 与 LINQ-to-XML 一起使用。

假设与 @rene 对变量 im 的答案中的 init 相同:

using System.Xml.Linq;
using System.Xml.XPath;
var inDoc = XElement.Parse(i);
var metaDoc = XElement.Parse(m);
inDoc.XPathSelectElement("//Body/MetaDataSet").ReplaceWith(metaDoc);