2010-08-09 3 views
17

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

+0

Я попытался изменить ваш вопрос, чтобы сделать его более понятным. Надеюсь, я не изменил смысл того, что вы пытались спросить. –

+1

Thanx. Я нашел решение без цикла: XmlNode footerNode = a.CreateElement ("ADD"); footerNode.InnerXml = b.SelectSingleNode ("/ root"). InnerXml; a.DocumentElement.AppendChild (footerNode); –

+0

Обратите внимание: этот сайт не является сервисом написания кода. Если вы задали свой вопрос, чтобы описать, что вы пробовали, так что далеко и где вы застряли, тогда мы можем попытаться помочь с конкретными проблемами . Вы также должны прочитать [ask]. –

ответ

27

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

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

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

EDIT: Если, как на ваш комментарий, вы хотите, чтобы встроить весь документ B в документе А, что относительно легко:

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

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

2

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

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

XmlDocument documentA; 
XmlDocument documentB; 

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

Я хочу добавить b XmlDocument как узел Xmldocument –

15

Вставка всего документа 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 в элемент документа А, вы можете использовать следующее:

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> 
+0

с помощью System.Xml – MacGyver

3

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

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