Я хочу объединить два XmlDocument
, вставив второй документ XML в конец существующего XmlDocument
в С#. Как это делается?
Как объединить два XmlDocuments в С#
Ответ 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);