Разбор XML: дерево элементов (etree) против минидома

Я много лет использую minidom для синтаксического анализа XML. Теперь я внезапно узнал о дереве элементов. Мой вопрос, что лучше для синтаксического анализа? Это:

  • Что быстрее?
  • Что использует меньше памяти?
  • Есть ли какие-либо зависимости O (n ^ 2), о которых мне следует беспокоиться?
  • Обесценивается ли одно в пользу другого?

Почему у нас два интерфейса?

Спасибо.


person vy32    schedule 05.11.2011    source источник


Ответы (2)


Python имеет два интерфейса, вероятно, потому, что дерево элементов было интегрировано в стандартную библиотеку намного позже, после появления минидома. Причиной этого, вероятно, был его гораздо более «питонический» API по сравнению с DOM, управляемым W3C.

Если вас беспокоит скорость, есть также lxml, который создает совместимую с ElementTree DOM с использованием libxml2 и должен быть довольно быстрым. - у них есть тестовый набор, который сравнивает себя с доступными реализациями Python и C.

Если вас беспокоит использование памяти, вам в любом случае не следует использовать древовидный API; PullDOM может быть лучшим выбором, но я экстраполирую из опыта использования превосходного синтаксического анализатора Java - похоже, что сейчас не так много текущей информации о PullDOM.

person millimoose    schedule 05.11.2011

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

Пакет ElementTree был предназначен для предоставления интерфейса в большей степени Pythonic. Все дело в упрощении работы программиста.

В зависимости от вашей сборки, каждая из них имеет базовую реализацию C, которая заставляет их работать быстро.

Ни один из перечисленных выше инструментов не является устаревшим. У каждого из них есть свои достоинства (например, Sax не нужно читать весь ввод в память).

Существует также сторонний модуль под названием lxml, который также является популярным выбором (полнофункциональный и быстрый).

person Raymond Hettinger    schedule 05.11.2011
comment
А если у вас есть проблемы с производительностью с элементом, есть lxml, который предоставляет совместимый интерфейс, но за кулисами использует закаленную в боях, хорошо настроенную библиотеку C. - person ; 05.11.2011
comment
ElementTree больше похож на Pythonic, потому что вы говорите myNode [3] вместо myNode.childNodes [3], чтобы получить второго потомка. Чтобы настроить любую реализацию DOM, нужно две строки кода, чтобы вы могли сделать то же самое. Что еще более важно, ElementTree обрабатывает текстовое содержимое, сильно отличное от почти любого другого инструмента, и значительно усложняет некоторые общие задачи. Например, чтобы собрать весь текст, вы должны не только рекурсировать, но и получить 2 свойства с каждого узла (текст в начале элемента сохраняется иначе, чем текст, следующий за подэлементом! ) - person TextGeek; 01.01.2020