Как проверить наличие поддерева в XML-документе
Мне нужно проверить, содержит ли документ XML данное поддерево XML DOM. Мне нужно только убедиться, что все элементы и атрибуты этого поддерева присутствуют в документе. Однако в поддереве документа может быть больше элементов или атрибутов, соответствующих данному поддереву, для сравнения. И я хочу, чтобы они были пропущены из сравнения.
До сих пор я реализовал свое собственное решение, которое находит поддерево, представленное классом Node в данном XML-документе. Этот класс Node содержит только атрибуты, необходимые для сравнения - имя элемента, текстовое содержимое, список дочерних узлов и карту атрибутов. Я реализовал свой собственный класс и не использовал org.w3c.dom.Node, потому что он слишком большой и содержит много ненужных атрибутов для моего тестового сценария. Поддерево, представленное корневым элементом Node, итерируется один элемент за другим, и каждое его поддерево ищется в данном XML-документе с использованием XPath до тех пор, пока не будет проверено все дерево или не будет найдено любое поддерево.
Это решение работает хорошо только тогда, когда мне нужно проверить, присутствует ли там поддерево или нет. Однако я использую это для проверки больших файлов конфигурации, которые часто меняются, и довольно сложно найти точное место, где произошло изменение. Вот почему я думаю об использовании какого-то существующего решения, которое имеет лучший выход и позволяет легко увидеть различия. К сожалению, я не смог найти ничего, соответствующего моим критериям.
Есть ли инструмент, который позволяет это? Я слышал о XMLUnit и быстро взглянул на него, но я не уверен, способен ли он найти поддерево в документе, игнорируя любые другие элементы или атрибуты. Можете ли вы показать мне пример, как это сделать в XMLUnit, если это возможно?
1 ответ
Нет, XMLUnit 1.x не подходит для этого. Вы можете использовать XPath, чтобы добраться до корневых узлов ваших поддеревьев, импортировать их в свежие Документы и сравнить их - но все равно нужно будет отфильтровать все различия, которые вас не интересуют.
В настоящее время мы работаем над XMLUnit 2.x, и он может в какой-то момент содержать инструменты, которые могут вам помочь (в настоящее время он не будет работать намного лучше, чем 1.x), но пока еще далеко не готов.