如何检查两个Xml树的相似性(树编辑C#中的距离)

时间:2016-02-14 14:31:13

标签: c# xml algorithm comparison

在C#应用程序中,我需要检查算法的输出,该算法是针对另一个XML树的XML树,以查看它们是如何相似的。 (节点顺序很重要,但结构(嵌套节点),节点名称更重要)。也许在某些“Tree Edit distance”算法中出现的addsremovesmoves的数量可能是一个很好的指标。但答案是更多Java或Python包。

所以,我尝试使用XMLDiffPatch,当算法类型设置为Precise时效果很好。但不好的是,它只是生成一个DiffGram文件,需要进行分析以查找操作数。此外,它非常错误,并为某些XML树生成OutOfRangeException。为了我的目的,我也找不到更好的软件包.Net。有一些Xml difference packages但可能没有或只有少数Tree Edit Distance

一个例子:

<A>
  <B>
    <C></C>
    <D></D>
    <E>
       <F>
       </F>
    </E>
  </B>
</A>

要:

<A>      
    <C></C>
    <D></D>
    <G></G>
</A>

要将第一个Xml转换为第二个Xml,您需要删除EF(2个费用),然后您需要删除B(但不是它的子树)并且添加G。然后总费用是4。

所以,正如我所知,我不应该要求包和工具,我要求一个简单的算法或(树编辑距离算法.Net )来做到这一点。这是我自己的算法来检查相似性并忽略微小的差异(有一个或几个嵌套节点),但它是非常主要的,只是一个起点:

public int XMLCompare(XmlNode primary, XmlNode secondary)
{
    int x = 0;
    if (secondary == null || primary == null)
        return 1;

    if (secondary.ChildNodes.Count == 1 && primary.ChildNodes.Count > 1)
    {
        x += XMLCompare(primary, secondary.ChildNodes[0]);
    }
    else if (secondary.ChildNodes.Count > 1 && primary.ChildNodes.Count == 1)
    {
        x += XMLCompare(primary.ChildNodes[0], secondary);
    }
    else
    {
        if (primary.Name.ToLower() != secondary.Name.ToLower())
            x = 1;
        int m = Math.Max(primary.ChildNodes.Count, secondary.ChildNodes.Count);
        for (int i = 0; i < m  i++)
        {
            x += XMLCompare(
            i < primary.ChildNodes.Count ? primary.ChildNodes[i] : null,  
            i < secondary.ChildNodes.Count ? secondary.ChildNodes[i] : null);

        }
    }

    return x;
}

1 个答案:

答案 0 :(得分:3)

微软有一个API。检查this。 这可能是旧的dll参考,但只是为了您的信息,您需要使用这样的东西。 C:\ Windows \ assembly \ GAC \ XmlDiffPatch \ 1.0.8.28__b03f5f7f11d50a3a \ XmlDiffPatch.dll