如何在C#中合并两个XmlDocuments

我想通过在C#中的现有Xmldocument的末尾插入第二个XML文档来合并两个XmlDocument 。 这是怎么做到的?

像这样的东西:

 foreach (XmlNode node in documentB.DocumentElement.ChildNodes) { XmlNode imported = documentA.ImportNode(node, true); documentA.DocumentElement.AppendChild(imported); } 

请注意,这会忽略文档B的文档元素本身 – 因此,如果它具有不同的元素名称或要复制的属性,则需要准确计算出要执行的操作。

编辑:如果,根据您的评论,您希望将整个文档B嵌入文档A中,这相对容易:

 XmlNode importedDocument = documentA.ImportNode(documentB.DocumentElement, true); documentA.DocumentElement.AppendChild(importedDocument); 

这仍然会忽略文档B的XML声明(如果有的话) – 我不知道如果您尝试将文档本身作为不同文档的节点导入会发生什么,并且它包含XML声明……但我怀疑这会做你想要的。

实际上,保证在另一个XML文档的末尾插入整个XML文档会产生无效的XML。 XML要求只有一个“document”元素。 因此,假设您的文件如下:

A.XML

  value1 value2  

B.XML

  value3 value4  

只需在另一端附加一个文档即可生成文档:

  value1 value2   value3 value4  

是无效的XML。

相反,假设这两个文档共享一个公共文档元素,并且您希望将文档元素的子元素从B插入到A的文档元素中,您可以使用以下命令:

 var docA = new XmlDocument(); var docB = new XmlDocument(); foreach (var childEl in docB.DocumentElement.ChildNodes) { var newNode = docA.ImportNode(childEl, true); docA.DocumentElement.AppendChild(newNode); } 

根据我上面的例子,这将产生以下文件:

  value1 value2 value3 value4  

这是合并xml文档最快的最简洁方法。

 XElement xFileRoot = XElement.Load(file1.xml); XElement xFileChild = XElement.Load(file2.xml); xFileRoot.Add(xFileChild); xFileRoot.Save(file1.xml); 

坏消息。 只要xml文档只能有一个根元素,就不能只将一个文档的内容放在第二个文档的末尾。 也许这就是你要找的? 它显示了使用Linq-to XML合并xml文件的难易程度

或者,如果您使用XmlDocuments,您可以尝试这样做:

 XmlDocument documentA; XmlDocument documentB; foreach(var childNode in documentA.DocumentElement.ChildNodes) documentB.DocumentElement.AppendChild(childNode);