Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Обратите внимание, что это игнорирует сам элемент документа документа B, поэтому, если у него есть другое имя элемента или атрибуты, которые вы хотите скопировать, вам нужно будет точно определить, что вы хотите сделать.

EDIT: если в соответствии с вашим комментарием вы хотите встроить весь документ B в документ A, это относительно легко:

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

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

Ответ 2

Вставка всего документа 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>

Ответ 3

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

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

Ответ 4

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

Альтернативно, если вы используете XmlDocuments, вы можете попробовать сделать это следующим образом:

XmlDocument documentA;
XmlDocument documentB;

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