Как объединить два XmlDocuments в C#
Я хочу объединить два XmlDocument
s, вставив второй документ 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);