Quel est le moyen le plus rapide de combiner deux fichiers XML en un seul

Si j’ai deux chaînes de xml1 et xml2 qui représentent toutes les deux xml dans le même format. Quel est le moyen le plus rapide de les combiner? Le format n’est pas important, mais je veux juste savoir comment puis-je me débarrasser ou?

xml1:

   test1 test2   

xm2:

    test6 test7   test99 test23   

et avoir quelque chose comme ça:

    test1 test2   test6 test7   test99 test23   

La méthode la plus simple consiste à utiliser LINQ to XML. Vous pouvez utiliser Union ou Concat selon vos besoins.

 var xml1 = XDocument.Load("file1.xml"); var xml2 = XDocument.Load("file2.xml"); //Combine and remove duplicates var combinedUnique = xml1.Descendants("AllNodes") .Union(xml2.Descendants("AllNodes")); //Combine and keep duplicates var combinedWithDups = xml1.Descendants("AllNodes") .Concat(xml2.Descendants("AllNodes")); 

Une transformation XSLT pourrait le faire:

              

Transmettez les noms des fichiers en tant que parameters, ainsi que le nom du nouvel élément racine.

Appliquer à tout document XML, par exemple un document vide.

C’est le moyen le plus rapide et le plus propre de fusionner des fichiers XML.

 XElement xFileRoot = XElement.Load(file1.xml); XElement xFileChild = XElement.Load(file2.xml); xFileRoot.Add(xFileChild); xFileRoot.Save(file1.xml); 

Si vous voulez utiliser XmlDocument, essayez ceci

  var lNode = lDoc1.ImportNode(lDoc2.DocumentElement.FirstChild, true); lDoc1.DocumentElement.AppendChild(lNode); 

Si vous pouvez garantir ce format, vous pouvez les combiner en manipulant des chaînes:

  • Lire le premier fichier, tout conserver avant “
  • Lire le deuxième fichier, supprimer la partie jusqu’à “
  • Combinez ces chaînes.

Cela devrait être le moyen le plus rapide, car aucune parsing n’est nécessaire.

 const ssortingng RelevantTag = "AllNodes"; ssortingng xml1 = File.ReadAllText(xmlFile1); xml1 = xml1.Subssortingng(0, xml.LastIndexOf("")); ssortingng xml2 = File.ReadAllText(xmlFile2); xml2 = xml2.Subssortingng(xml.IndexOf("<" + RelevantTag + ">") + "<" + RelevantTag + ">".Length, xml1.Length); File.WriteAllText(xmlFileCombined, xm1 + xml2); 

Cela dit, je préférerais toujours le moyen sûr au moyen rapide.

Vous avez deux options de base:

  1. Analyser le XML, combiner les structures de données, sérialiser en XML.

  2. Si vous connaissez la structure, utilisez une manipulation de chaîne de base pour la pirater. Par exemple, dans l’exemple ci-dessus, vous pouvez prendre l’intérieur de tous les noeuds dans les deux blocs XML et les placer dans un seul bloc allnodes.

var doc = XDocument.Load (“fichier1.xml”);

var doc1 = XDocument.Load (“fichier2.xml”);

doc.Root.Add (doc2.Root.Elements ());

La meilleure solution pour moi, basée sur la réponse de Jose Basilio, légèrement modifiée,

 var combinedUnique = xml1.Descendants() .Union(xml2.Descendants()); combinedUnique.First().Save(#fullName) 

Si je faisais cela (en utilisant C #), je créerais une classe dans laquelle je peux désérialiser ce XML (vous pouvez utiliser xsd.exe pour le faire), puis faire une boucle sur tous les nœuds de l’object représentant le premier morceau de XML. et “Ajoutez” à la propriété AllNodes de l’object représentant le deuxième XML.

Puis sérialisez la seconde classe en arrière sur le XML, et cela devrait ressembler à votre 3ème exemple.

Depuis que vous avez demandé le plus rapide :

Si (et seulement si) la structure XML est toujours cohérente: (c’est du pseudo-code)

 ssortingng xml1 = //get xml1 somehow ssortingng xml2 = //get xml2 somehow xml1 = replace(xml1, "", ""); xml1 = replace(xml1, "", ""); xml1 = replace(xml1, "", ""); xml2 = replace(xml2, "", "\n" + xml1); 

C’est un hack géant mais c’est rapide. Attendez-vous à le voir sur TheDailyWTF lorsque vos collègues le trouveront.

Dans mon cas, la solution principale ne fonctionnait pas bien . La différence, c’était que j’avais une liste pour des milliers de fichiers lorsque je prenais un élément et que je tentais de fusionner avec le premier élément auquel j’ai eu une exception OutOfMemory; row (NodeA dans ce cas) pour résoudre le problème étrange de la mémoire et fonctionner en douceur.

Je sauvegarde le document dans un autre processus

 XDocument xmlDocTemplate = GetXMLTemplate(); -- create an empty document with the same root and empty row element (NodeA), everything will be merge here. List lstxElements = GetMyBunchOfXML(); foreach (var xmlElement lstxElements) { xmlDocTemplate .Root .Descendants("NodeA") .LastOrDefault() .AddAfterSelf(xmlElement.Descendants("NodeA")); }