合并xml文档

我遇到的关于合并XML文档的所有解决方案都达不到我想要的。 让我解释:

XML文档1:

       

XML文档2:

            

进入这样的最终文档:

             

文档内容相似,但可以具有任意数量的子节点。 我也想消除重复。 我认为重复是具有相同属性的元素(基于属性名称和值)。 有谁见过这个实现的工作示例? 我可以想象如何使用一些循环和一些递归来编写它,但对我来说,这似乎不是实现我想要的最佳方式:)

欢呼并提前谢谢!

*编辑*

既然共识是循环和递归是必须的,那么最优雅和有效的方法是什么呢? 我想这个问题的另一个基本问题是在迭代时比较节点的最佳方法是什么?

最终,任何解决此问题的方法都将归结为循环和/或递归。 您正在谈论基本集合理论,而linq可能对提取流程很有用,但它最终将迭代两个集合并合并结果。

我写了一个IEqualityComparer ,它指定两个节点何时是’匹配’ – 即设置标题匹配规则。

 class XElementComparer : IEqualityComparer { public bool Equals(XElement x, XElement y) { var xTitle = x.Attribute("title"); var yTitle = y.Attribute("title"); if (xTitle == null || yTitle == null) return false; return xTitle.Value == yTitle.Value; } public int GetHashCode(XElement obj) { return base.GetHashCode(); } } 

然后编写一个递归方法来遍历XML,合并根据比较器匹配的节点。

 private XElement Merge(XElement node1, XElement node2) { // trivial cases if (node1 == null) return node2; if (node2 == null) return node1; var elements1 = node1.Elements(); var elements2 = node2.Elements(); // create a merged root var result = new XElement(node1.Name, node1.Attribute("title")); var comparer = new XElementComparer(); var mergedNodes = elements1.Union(elements2, comparer).ToList(); // for the union of the elements, insert their merge values foreach (var title in mergedNodes) { var child1 = elements1.SingleOrDefault(e => comparer.Equals(e, title)); var child2 = elements2.SingleOrDefault(e => comparer.Equals(e, title)); result.Add(Merge(child1, child2)); } return result; }