使用linq合并具有相同结构的多个XML文件,并根据键删除重复项
我有多个XML文件,我正在尝试合并到一个文件中。 Linq to XML可能是最好的选择,但我对创意持开放态度(XSLT似乎很擅长合并两个文件,但在n> 2或n = big时很笨拙)。
从这里阅读其他问题,某种联系看起来很好。
File1.xml:
File2.xml:
Merged.xml:
即它根据第三个/ @id属性合并值。
我如何用linq优雅地做到这一点?
下面的内容仍然相当丑陋,我相信它可以通过一些工作带入更加流线型的形状,但是现在这似乎可以完成这项工作:
public static void MergeXml() { var xdoc1 = XDocument.Load(@"c:temptest.xml"); var xdoc2 = XDocument.Load(@"c:temptest2.xml"); var d1Targets = xdoc1.Descendants("third"); var d2Selection = xdoc2.Descendants("third").ToList(); Func attributeMatches = (x, y, a) => x.Attribute(a).Value == y.Attribute(a).Value; Func, XElement, bool> hasMatchingValue = (ys, x) => // remove && if matching "a" should cause replacement. ys.Any(d => attributeMatches(d, x, "a") && attributeMatches(d, x, "b")); foreach (var e in d1Targets) { var fromD2 = d2Selection.Find(x => attributeMatches(x, e, "id")); if (fromD2 != null) { d2Selection.Remove(fromD2); var dest = e.Descendants("value"); dest.LastOrDefault() .AddAfterSelf(fromD2.Descendants("value").Where(x => !hasMatchingValue(dest, x))); } }; if (d2Selection.Count > 0) d1Targets.LastOrDefault().AddAfterSelf(d2Selection); xdoc1.Save(@"c:tempmerged.xml"); }
这将从OPs问题中的两个示例输入文件生成以下输出文件:
这应该使用LINQ将第二个文件’contents’合并到第一个文件中。
XDocument document = XDocument.Load("File1.xml"); XElement secondElement = document.Descendants("second").FirstOrDefault(); XDocument document2 = XDocument.Load("File2.xml"); XElement secondlement2 = document2.Descendants("second").FirstOrDefault(); secondElement.Add(secondlement2.Nodes());
更新 – 添加以下代码以满足最终输出中的唯一条目。
上述就是C#学习教程:使用linq合并具有相同结构的多个XML文件,并根据键删除重复项分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
XDocument document = XDocument.Load(@"File1.xml"); XElement secondElement = document.Descendants("second").FirstOrDefault(); XDocument document2 = XDocument.Load(@"File2.xml"); XElement secondlement2 = document2.Descendants("second").FirstOrDefault(); var startingNodes = (from n2 in secondElement.Descendants("third") select n2.Attribute("id").Value).ToList(); var nonUniqueNodes = (from n in secondlement2.Descendants("third") where startingNodes.Contains(n.Attribute("id").Value) select n).ToList(); secondElement.Add(secondlement2.Elements().Except(nonUniqueNodes));
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1011580.html