Я хочу определить, являются ли два разных дочерних узла в документе 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 node) с теми же свойствами (w: pPr node) как еще один абзац ранее в документе.
Одна из моих идей - хранить внешний XML-код узлов в хэш-наборе (обычно мне нужно было бы получить представление канонической строки сначала, где атрибуты и дочерние заметки будут отсортированы всегда одинаково, но я могу ожидать, узлы уже должны быть в такой форме).
Другая идея заключалась бы в создании объекта XmlNode для каждого node и записи сравнения, который сравнивает все атрибуты и дочерние узлы.
Моя среда - С# (.Net 2.0); любая обратная связь и дальнейшие идеи очень приветствуются. Может быть, у кого-то даже есть хорошее решение?
EDIT: Microsoft XmlDiff API действительно может это сделать, но мне было интересно, будет ли более легкий подход. XmlDiff, кажется, всегда создает diffgram и всегда создает каноническое представление node во-первых, обе вещи, которые мне не нужны.
EDIT2: Я, наконец, внедрил свой собственный XmlNodeEqualityComparer на основе предлагаемого здесь предложения. Большое спасибо!!!!
Спасибо, диво