2008-11-11 3 views
14

Я пытаюсь объединить несколько XML-файлов в одном объекте XDocument.Объединить XML-файлы в XDocument

Слияние не существует в объекте XDocument. Я упустил это.

Кто-нибудь уже реализовал метод расширения слияния для XDocument или что-то подобное?

ответ

24

Я попытался немного себя:

var MyDoc = XDocument.Load("File1.xml"); 
MyDoc.Root.Add(XDocument.Load("File2.xml").Root.Elements()); 

Я не знаю, хорошо ли это или плохо, но это работает хорошо для меня :-)

0

В качестве обходного пути вы можете использовать XSL-файл для объединения файлов XML, а затем преобразовать его в объект XDocument.

+1

Спасибо. Извините, я ненавижу XSL. Я определенно предпочел бы решение на основе кода C#. – Larry 2008-11-11 08:24:26

+0

Нет проблем, я понимаю, как избежать XSL, поскольку иногда это может быть очень запутанным. – schnaader 2008-11-11 08:32:32

3

Будучи прагматичным, XDocument против XmLDocument не является все-или-ничего (если вы не на Silverlight) - так что если XmlDoucument делает то, что вам нужно, и XDocument не произойдет, то, возможно, использовать XmlDocumentImportNode и т.д.).

Сказанное, даже с XDocument, вы можете использовать XNode.ReadFrom для импорта каждого, а затем просто .Add его в основную коллекцию.

Конечно, если файлы большие, XmlReader/XmlWriter может быть более эффективным ... но сложнее. К счастью, XmlWriter имеет метод WriteNode, который принимает XmlReader, поэтому вы можете перейти к первому ребенку в XmlReader, а затем просто добавить его в выходной файл. Что-то вроде:

static void AppendChildren(this XmlWriter writer, string path) 
    { 
     using (XmlReader reader = XmlReader.Create(path)) 
     { 
      reader.MoveToContent(); 
      int targetDepth = reader.Depth + 1; 
      if(reader.Read()) { 
       while (reader.Depth == targetDepth) 
       { 
        writer.WriteNode(reader, true); 
       }     
      } 
     } 
    } 
3

Объединить все файлы XML от источника до одного XDocument

public static XDocument MergeDir(string xmlDir) 
{ 
    XDocument xdoc = XDocument.Parse("<root></root>"); 
    System.IO.DirectoryInfo directory = new DirectoryInfo(xmlDir); 
    if (directory.Exists) 
    { 
     foreach (System.IO.FileInfo file in directory.GetFiles()) 
     { 
      if (file.Extension == ".xml") 
      { 
       xdoc.Root.Add(XDocument.Load(file.FullName).Root.Elements()); 
      } 
     } 
    } 

    return xdoc; 
} 
Смежные вопросы