Подтвердить что ты не робот

Как проверить сходство двух деревьев Xml (Tree Edit Distance в С#)

В приложении С# мне нужно проверить вывод моего алгоритма, который является деревом XML для другого дерева XML, чтобы увидеть, как они похожи. (node порядок важен, но структура (вложенные узлы), имена узлов более важны). Возможно, число adds, removes и moves, которое встречается в некоторых алгоритмах Дерево редактирования расстояния", является хорошим индикатором. Но ответы - это больше пакетов Java или Python.

Итак, я попытался использовать XMLDiffPatch, он работает хорошо, когда тип алгоритма установлен на Precise. Однако его плохой момент состоит в том, что он просто генерирует файл DiffGram, который необходимо проанализировать, чтобы найти количество операций. Более того, он очень глючит и генерирует OutOfRangeException для некоторых деревьев XML. Я также не мог найти лучшие пакеты для своей цели .Net. Есть несколько пакетов разметки Xml, но, возможно, ни один из них не находится на Tree Edit Distance.

Пример:

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

To:

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

Чтобы преобразовать первый Xml во второй, вам нужно удалить E и F (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;
}
4b9b3361

Ответ 1

У Microsoft есть API для этого. проверьте этот. Это может быть старая ссылка dll, но только для вас информация, вам нужно использовать что-то вроде этого. C:\Windows\assembly\GAC\XmlDiffPatch\1.0.8.28__b03f5f7f11d50a3a\XmlDiffPatch.dll