2008-11-11 10 views
14

Estoy tratando de combinar varios archivos XML en un solo objeto XDocument.Fusionar archivos XML en un XDocument

Merge no existe en el objeto XDocument. Extraño esto.

¿Alguien ha implementado ya un método de extensión Merge para XDocument, o algo similar?

Respuesta

24

Probé un poco a mí mismo:

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

No sé si es bueno o malo, pero funciona bien para mí :-)

0

Como solución alternativa, puede usar un archivo XSL para combinar los archivos XML y luego transformarlo en un objeto XDocument.

+1

Gracias. Lo siento, odio XSL. Definitivamente preferiría una solución basada en el código C#. – Larry

+0

No hay problema, entiendo la evasión de XSL ya que a veces puede ser muy confuso. – schnaader

3

Ser pragmático, XDocument vs XmLDocument no es todo o nada (a menos que esté en Silverlight) - por lo que si XmlDoucument hace algo que necesita, y XDocument no lo hace, entonces tal vez usar XmlDocument (con ImportNode etc).

Dicho esto, incluso con XDocument, puede presumiblemente usar XNode.ReadFrom para importar cada uno, luego simplemente .Add a la colección principal.

Por supuesto, si los archivos son grandes, XmlReader/XmlWriter podría ser más eficiente ... pero más complejo. Afortunadamente, XmlWriter tiene un método WriteNode que acepta un XmlReader, por lo que puede navegar hasta el primer elemento secundario en el XmlReader y luego simplemente cargarlo en el archivo de salida. Algo así como:

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

Muchas gracias :) Creo que he encontrado algo que funciona con menos código. – Larry

3

Combinar todos los archivos XML de dir a uno 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; 
} 
Cuestiones relacionadas