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