Я хочу определить, равны ли два разных дочерних узла в документе XML. Два узла следует считать равными, если они имеют одинаковый набор атрибутов и дочерних заметок, и все дочерние заметки тоже равны (то есть все поддерево должно быть равным).
Входной документ может быть очень большим (до 60 МБ, более 100 000 узлов для сравнения), и производительность является проблемой.
Какой эффективный способ проверить равенство двух узлов?
Пример:
<w:p>
<w:pPr>
<w:spacing w:after="120"/>
</w:pPr>
<w:r>
<w:t>Hello</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:spacing w:after="240"/>
</w:pPr>
<w:r>
<w:t>World</w:t>
</w:r>
</w:p>
Этот фрагмент XML описывает абзацы в документе OpenXML. Алгоритм будет использоваться для определения того, содержит ли документ абзац (узел w: p) с теми же свойствами (узел w: pPr), что и другой абзац ранее в документе.
Одной из моих идей было бы сохранить внешний XML-узел в хэш-наборе (Обычно мне сначала нужно получить каноническое строковое представление, где атрибуты и дочерние заметки всегда сортируются одинаково, но я могу ожидать узлы уже должны быть в такой форме).
Другой идеей было бы создать объект XmlNode для каждого узла и написать компаратор, который сравнивает все атрибуты и дочерние узлы.
Моя среда - C # (.Net 2.0); любые отзывы и дальнейшие идеи очень приветствуются. Может, у кого-нибудь уже есть хорошее решение?
РЕДАКТИРОВАТЬ: Microsoft XmlDiff API действительно может сделать это, но мне было интересно, будет ли более легкий подход. Кажется, что XmlDiff всегда создает diffgram и всегда сначала создает каноническое представление узла, обе вещи мне не нужны.
EDIT2: я наконец-то реализовал свой собственный XmlNodeEqualityComparer на основе предложенного здесь предложения. Большое спасибо !!!!
Спасибо,
диво