2009-08-18 6 views
5

Кто-нибудь знает, как получить экземпляр DOM (дерево) XML-файла в Python. Я пытаюсь сравнить два документа XML с eachother, которые могут иметь элементы и атрибуты в другом порядке. Как мне это сделать?Получение дерева DOM документа XML

ответ

2

Лично, по возможности, я начинал с elementtree (желательно реализация C, поставляемая с стандартной библиотекой Python, или реализация lxml, но это важно только для более высокой скорости). Это не стандартная DOM, но содержит ту же информацию в более Pythonic и удобном способе. Вы можете начать с вызова xml.etree.ElementTree.parse, который берет источник XML и возвращает дерево элементов; сделайте это в обоих источниках, используйте getroot для каждого дерева элементов, чтобы получить его корневой элемент, а затем рекурсивно сравнить элементы, начиная с корневых.

Дети элемента образуют последовательность, в дереве элементов, как и в стандартном DOM, что означает, что их порядок считается важным; но из них легко сделать из них Python (или с небольшими усилиями «несколько наборов», если повторения важны в вашем случае использования, а порядок - нет) для сравнения с слабее. Это еще проще для атрибутов для данного элемента, где уникальность гарантирована, а порядок семантически не релевантен.

Есть ли какая-то конкретная причина, по которой вам нужен стандартный DOM, а не альтернативный контейнер, например дерево элементов, или вы просто используете термин DOM в общем смысле, чтобы дерево элементов было в порядке?

В прошлом у меня также были хорошие результаты, используя PyRXP, который использует четное и простое представление, чем ElementTree. Однако это было много лет назад; У меня нет недавнего опыта относительно того, как PyRXP сегодня сравнивается с lxml или cElementTree.

1

Некоторые решения, чтобы обдумать:

+0

Я посмотрел на мини-диск и нет никакой информации в документации о том, как получить дерево DOM из проанализированного файла. Я бы хотел сравнить два дерева, чтобы порядок не имел значения. Вы знаете, как это сделать? – Dave

+0

Мини-документация в Python 2.6 дает пример получения DOM из файла (вы после чего-то еще) из xml.dom.parseString dom1 = parse ('c: \\ temp \\ mydata.xml') # обрабатывать XML-файл по имени – Mark

0

Для сравнения экземпляров XML документа, наивный сравнить из разбираемых DOM деревьев не будет работать. Вы, вероятно, нужно реализовать свой собственный NodeComperator рекурсивно сравнивает узел и его дочерние-узлы с каким-либо другим узлом и его дочерних-узлов на основе ваших конкретных критериев, таких как:

  • Когда порядок дочерних элементов существенных ?
  • Когда пробел в текстовом содержании значителен?
  • Существуют ли значения по умолчанию для некоторых элементов и применяются ли они к вашему парсеру?
  • объектные ссылки должны быть расширены для сравнения

Minidom является хорошей отправной точкой для разбора файлов и проста в использовании. Однако фактическая реализация функции сравнения для вашего конкретного приложения должна выполняться вами.

Смежные вопросы