将两个xml文件合并为一个的最快方法是什么

如果我有两个xml1和xml2字符串,它们都以相同的格式表示xml。 将这些组合在一起的最快方法是什么? 格式并不重要,但我只是想知道如何摆脱或?

xml1:

   test1 test2   

xm2:

    test6 test7   test99 test23   

并有这样的事情:

    test1 test2   test6 test7   test99 test23   

最简单的方法是使用LINQ to XML。 您可以根据需要使用Union或Concat 。

 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")); 

XSLT转换可以做到:

              

将文件名作为参数传递,以及新根元素的名称。

适用于任何XML文档,例如空文档。

这是合并xml文件的最快,最干净的方法。

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

如果要使用XmlDocument,请尝试此操作

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

如果你能保证这种格式,你可以通过字符串操作来组合它们:

  • 读取第一个文件,保留“”之前的所有内容
  • 读取第二个文件,将部分删除到“
  • 结合这些字符串。

这应该是最快的方法,因为不需要解析。

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

这就是说我总是喜欢快速通道的安全方式。

您有两个基本选项:

  1. 解析xml,合并数据结构,序列化回xml。

  2. 如果您知道结构,请使用一些基本的字符串操作来破解它。 例如,在上面的示例中,您可以获取两个xml块中的所有节点的内部,并将它们放在单个allnodes块中并完成。

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

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

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

对我来说最好的解决方案,基于Jose Basilio的回答,略有修改,

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

如果我这样做(使用C#),我将创建一个类,我可以将此反序列化为(您可以使用xsd.exe执行此操作),然后遍历表示第一个XML的对象中的所有节点并将它们“添加”到表示第二个XML的对象的AllNodes属性中。

然后将第二个类序列化为XML,它应该看起来像你的第三个例子。

既然你要求最快

如果(且仅当)xml结构始终一致:(这是伪代码)

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

这是一个巨大的黑客,但它很快。 当你的同事找到它时,期待在TheDailyWTF上看到它。

在我的情况下,主要解决方案不能很好地工作 ,不同之处在于,当我拿一个元素并尝试与第一个元素合并时,我得到了一个数千个文件的List我得到了OutOfMemoryexception,我添加了一个空模板和空行(本例中NodeA)解决了内存的奇怪问题并顺利运行。

我在其他过程中保存文档

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