Это может стать сложнее. Посмотрите на этот пример:
<w:p>
<w:pPr>
<w:spacing w:after="1"/>
</w:pPr>
<w:r>
<w:t>World</w:t> <-- Case 1: this changes to <w:t>ASDF</w:t>
<w:t>World</w:t> <-- Case 2: this changes to <w:t>ASDF</w:t>
</w:r>
</w:p>
Чтобы распознать оба случая, вам нужно сохранить один как
div: <w:p><w:r><w:t>World</w:t> -> <w:p><w:r><w:t>ASDF</w:t>
, а другой как
div: <w:p><w:r><w:t>World</w:t><w:t>World</w:t> -> <w:p><w:r><w:t>World</w:t><w:t>ASDF</w:t>
или что-то подобное (вы также можете добавить закрывающие теги "w: p" к ним обоим, чтобы сделать их действительными поддеревьями XML).
В целом, такие программы могут быть очень сложными, поэтому я бы не рекомендовал вам создавать что-то совершенно новое, кроме как использовать какой-либо существующий алгоритм сравнения (большинство из них будут достаточно хорошими даже без разбора структуры XML) или модифицировать его. из них, чтобы удовлетворить ваши потребности.