如何在C#中合并两个XmlDocuments

Har*_*OTA 22 .net c# xml

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

Jon*_*eet 30

像这样的东西:

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

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

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

XmlNode importedDocument = documentA.ImportNode(documentB.DocumentElement, true);
documentA.DocumentElement.AppendChild(importedDocument);
Run Code Online (Sandbox Code Playgroud)

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


Rya*_*ner 16

Inserting an entire XML document at the end of another XML document is actually guaranteed to produce invalid XML. XML requires that there be one, and only one "document" element. So, assuming that your files were as follows:

A.xml

<document>
   <element>value1</element>
   <element>value2</element>
</document>
Run Code Online (Sandbox Code Playgroud)

B.xml

<document>
   <element>value3</element>
   <element>value4</element>
</document>
Run Code Online (Sandbox Code Playgroud)

结果文档只需在另一端附加一个:

<document>
   <element>value1</element>
   <element>value2</element>
</document>
<document>
   <element>value3</element>
   <element>value4</element>
</document>
Run Code Online (Sandbox Code Playgroud)

是无效的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);
}
Run Code Online (Sandbox Code Playgroud)

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

<document>
   <element>value1</element>
   <element>value2</element>
   <element>value3</element>
   <element>value4</element>
</document>
Run Code Online (Sandbox Code Playgroud)


Rud*_*osa 7

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

XElement xFileRoot = XElement.Load(file1.xml);
XElement xFileChild = XElement.Load(file2.xml);
xFileRoot.Add(xFileChild);
xFileRoot.Save(file1.xml);
Run Code Online (Sandbox Code Playgroud)