2008-11-11 10 views
14

Ich versuche mehrere XML-Dateien in einem einzigen XDocument-Objekt zusammenzuführen.XML-Dateien in einem XDocument zusammenführen

Zusammenführung existiert nicht in XDocument-Objekt. Ich vermisse das.

Hat bereits jemand eine Merge-Erweiterung für XDocument oder etwas ähnliches implementiert?

Antwort

24

Ich habe versucht, ein bisschen selbst:

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

Ich weiß nicht, ob es gut oder schlecht ist, aber es funktioniert gut zu mir :-)

0

Als Workaround könnten Sie eine XSL-Datei verwenden, um die XML-Dateien zusammenzuführen und sie dann in ein XDocument-Objekt umzuwandeln.

+1

Vielen Dank. Es tut mir leid, ich hasse XSL. Ich würde definitiv eine C# code basierte Lösung bevorzugen. – Larry

+0

Kein Problem, ich verstehe XSL Vermeidung, da es manchmal sehr verwirrend sein kann. – schnaader

3

pragmatisch zu sein, XDocument vs XmLDocument ist nicht alles-oder-nichts (es sei denn, Sie auf Silverlight) sind - also wenn XmlDoucument etwas tut, was Sie brauchen, und XDocument nicht, dann verwenden Sie vielleicht XmlDocument (mit ImportNode usw.).

Das sagte, selbst mit XDocument, könnten Sie wahrscheinlich XNode.ReadFrom verwenden, um jedes zu importieren, dann einfach .Add es in die Hauptsammlung.

Natürlich, wenn die Dateien groß sind, könnte XmlReader/XmlWriter effizienter sein ... aber komplexer. Zum Glück hat XmlWriter eine WriteNode Methode, die eine XmlReader akzeptiert, so dass Sie zum ersten Kind in der XmlReader navigieren und dann einfach in die Ausgabedatei blitzen können. Etwas wie:

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); 
       }     
      } 
     } 
    } 
+0

Vielen Dank :) Ich denke, ich habe etwas gefunden, das mit weniger Code funktioniert. – Larry

3

Merge alle XML-Dateien von dir zu einem 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; 
}