如何检查不同 XML 文件中包含的 XML 节点是否相等?

我有两个使用该System.Xml.XmlDocument.LoadXml(fileName)方法读取的 XML 文件(文件 A 和文件 B,其中文件 A 是文件 B 的子集)。


然后,我使用System.Xml.XmlNode.SelectNodes(nodeName)我需要比较文件 A 中的每个选定 xml 节点是否相等或文件 B 中同一节点的子集来选择这些文件中的节点。还需要检查任何节点中包含的子节点的顺序文件 A 中的子节点的顺序与文件 B 中该节点中包含的相同子节点的顺序相同。


例如,


文件A


<rootNodeA>

 <elementA>

  <subelementA>content</subElementA>

  <subelementB>content</subElementB>

  <subelementB>content</subElementC>

  <subelementB>content</subElementD>

 </elementA>

 <elementB>

  <subelementA>content</subElementA>

  <subelementB>content</subElementB>

 </elementB>

</rootNodeA>

文件B


<rootNodeB>

 <elementA>

  <subelementB>content</subElementB>

  <subelementD>content</subElementD>

 </elementA>

 <elementB>

  <subelementA>content</subElementA>

 </elementB>

</rootNodeB>

如您所见,fileB 是 fileA 的子集。我需要检查elementA文件 B 的节点是否相等或文件 A 中同一节点的子集。对于子节点(等)和节点/子节点的内容也elementA应该如此。subElementA


此外,如果您elementA在 fileA 中看到,则按 A、B、C、D 的顺序有 4 个子元素。对于elementAfileB 中的相同内容,按 A、D 的顺序有 2 个子元素。该顺序即A在D之前与文件A中的顺序相同,也需要检查这一点。


我的想法是计算节点的哈希值,然后比较它们,但不确定如何或是否能满足目的。


编辑:我到目前为止的代码,


    HashSet<XmlElement> hashA = new HashSet<XmlElement>();

    HashSet<XmlElement> hashB = new HashSet<XmlElement>();


                foreach (XmlElement node in nodeList)

                {

                    hashA.Add(node);

                }

                foreach(XmlElement node in masterNodeList)

                {

                    hashB.Add(node);

                }

                isSubset = new HashSet<XmlElement>(hashA).IsSubsetOf(hashB);

            return isSubset;


茅侃侃
浏览 201回答 1
1回答

炎炎设计

这听起来像是一个简单的递归函数。没有检查它是否真的有效,但应该这样做:public static bool isSubset(XmlElement source, XmlElement target)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (!target.HasChildNodes)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (source.HasChildNodes) // surly not same.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return string.Equals(source.Value, target.Value); // equalize values.&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; var sourceChildren = source.ChildNodes.OfType<XmlElement>().ToArray(); // list all child tags in source (by order)&nbsp; &nbsp; &nbsp; &nbsp; var currentSearchIndex = 0; // where are we searching from (where have we found our match)&nbsp; &nbsp; &nbsp; &nbsp; foreach (var targetChild in target.ChildNodes.OfType<XmlElement>())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var findIndex = Array.FindIndex(sourceChildren, currentSearchIndex, el => el.Name == targetChild.Name);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (findIndex == -1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false; // not found in source, therefore not a subset.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!isSubset(sourceChildren[findIndex], targetChild))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false; // if the child is not a subset, then parent isn't too.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentSearchIndex = findIndex; // increment our search index so we won't match nodes that already passed.&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP