Как объединить два XmlDocuments в C#

Я хочу объединить два XmlDocuments, вставив второй документ XML в конец существующего Xmldocument в C#. Как это сделать?

4 ответа

Решение

Что-то вроде этого:

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

Это все равно будет игнорировать такие вещи, как декларация XML документа B, если таковая имеется - я не знаю, что произойдет, если вы попытаетесь импортировать сам документ как узел другого документа, и он включал декларацию XML... но я подозреваю, что это будет делать то, что вы хотите.

Вставка всего XML-документа в конец другого XML-документа фактически гарантирует получение недопустимого XML. XML требует, чтобы был один и только один элемент "документ". Итак, предположим, что ваши файлы были следующими:

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>

Это самый быстрый и чистый способ объединения XML-документов.

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

Плохие новости. Поскольку у документов xml может быть только один корневой элемент, вы не можете просто поместить содержимое одного документа в конец второго. Может быть, это то, что вы ищете? Он показывает, как легко вы можете объединить XML-файлы, используя Linq-to-XML

В качестве альтернативы, если вы используете XmlDocuments, вы можете попробовать сделать так:

XmlDocument documentA;
XmlDocument documentB;

foreach(var childNode in documentA.DocumentElement.ChildNodes)
   documentB.DocumentElement.AppendChild(childNode);
Другие вопросы по тегам