xdocument tutorial query net manejo leer example ejemplos c# xml linq-to-xml

c# - tutorial - Fusionar archivos XML en un XDocument



xdocument c# example (4)

Intenté un poco yo 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í :-)

Estoy intentando fusionar varios archivos XML en un solo objeto XDocument.

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

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


Siendo pragmático, XDocument vs XmLDocument no es todo o nada (a menos que esté en Silverlight), así que si XmlDoucument hace algo que usted necesita, y XDocument no lo hace, entonces quizás use XmlDocument (con ImportNode etc.).

Dicho esto, incluso con XDocument , se puede 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 XmlReader al archivo de salida. Algo 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); } } } }


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


Fusiona 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; }