为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
茅侃侃 2022-01-16 15:04:06
我有两个使用该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;
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

这听起来像是一个简单的递归函数。


没有检查它是否真的有效,但应该这样做:


public static bool isSubset(XmlElement source, XmlElement target)

    {

        if (!target.HasChildNodes)

        {

            if (source.HasChildNodes) // surly not same.

                return false;

            return string.Equals(source.Value, target.Value); // equalize values.

        }


        var sourceChildren = source.ChildNodes.OfType<XmlElement>().ToArray(); // list all child tags in source (by order)

        var currentSearchIndex = 0; // where are we searching from (where have we found our match)


        foreach (var targetChild in target.ChildNodes.OfType<XmlElement>())

        {

            var findIndex = Array.FindIndex(sourceChildren, currentSearchIndex, el => el.Name == targetChild.Name);

            if (findIndex == -1)

                return false; // not found in source, therefore not a subset.


            if (!isSubset(sourceChildren[findIndex], targetChild))

                return false; // if the child is not a subset, then parent isn't too.


            currentSearchIndex = findIndex; // increment our search index so we won't match nodes that already passed.

        }

    }


查看完整回答
反对 回复 2022-01-16
  • 1 回答
  • 0 关注
  • 200 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信