将两个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);
如果你能保证这种格式,你可以通过字符串操作来组合它们:
- 读取第一个文件,保留“ AllNodes>”之前的所有内容
- 读取第二个文件,将部分删除到“
” - 结合这些字符串。
这应该是最快的方法,因为不需要解析。
const string RelevantTag = "AllNodes"; string xml1 = File.ReadAllText(xmlFile1); xml1 = xml1.Substring(0, xml.LastIndexOf("" + RelevantTag + ">")); string xml2 = File.ReadAllText(xmlFile2); xml2 = xml2.Substring(xml.IndexOf("<" + RelevantTag + ">") + "<" + RelevantTag + ">".Length, xml1.Length); File.WriteAllText(xmlFileCombined, xm1 + xml2);
这就是说我总是喜欢快速通道的安全方式。
您有两个基本选项:
-
解析xml,合并数据结构,序列化回xml。
-
如果您知道结构,请使用一些基本的字符串操作来破解它。 例如,在上面的示例中,您可以获取两个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")); }