如何在C#中合并两个XmlDocuments

时间:2010-08-09 12:42:22

标签: c# .net xml

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

4 个答案:

答案 0 :(得分:28)

这样的事情:

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声明......但我怀疑这会做你想要的。

答案 1 :(得分:16)

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

<强> A.XML

<document>
   <element>value1</element>
   <element>value2</element>
</document>

<强> B.XML

<document>
   <element>value3</element>
   <element>value4</element>
</document>

通过在另一端的末尾附加一个来生成文档:

<document>
   <element>value1</element>
   <element>value2</element>
</document>
<document>
   <element>value3</element>
   <element>value4</element>
</document>

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);
}

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

<document>
   <element>value1</element>
   <element>value2</element>
   <element>value3</element>
   <element>value4</element>
</document>

答案 2 :(得分:7)

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

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

答案 3 :(得分:3)

坏消息。只要xml文档只能有一个根元素,就不能只将一个文档的内容放在第二个文档的末尾。也许this正是您要找的?它显示了使用Linq-to-XML

合并xml文件的容易程度

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

XmlDocument documentA;
XmlDocument documentB;

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