Какую библиотеку Python XML мне следует использовать? - PullRequest
3 голосов
/ 26 мая 2010

Я собираюсь обработать XML-файлы для проекта. Ранее я решил использовать lxml, но после прочтения требований я думаю, что ElemenTree будет лучше для моих целей.

XML-файлы, которые должны быть обработаны:

  1. Маленький по размеру. Обычно <10 КБ. </p>

  2. Нет пространств имен.

  3. Простая структура XML.

Учитывая небольшой размер XML, память не является проблемой. Мое единственное беспокойство - быстрый разбор.

С чем мне идти? В основном я видел, как люди рекомендуют lxml, но, учитывая мои требования к парсингу, могу ли я извлечь из этого пользу или ElementTree лучше послужит моим целям?

Ответы [ 3 ]

2 голосов
/ 26 мая 2010

Как уже отмечали другие, lxml реализует API ElementTree, поэтому вы можете начать с ElementTree и перейти на lxml, если вам нужна более высокая производительность или более продвинутые функции.

Большим преимуществом использования ElementTree, если оно соответствует вашим потребностям, является то, что начиная с Python 2.5 он является частью стандартной библиотеки Python , которая сокращает внешние зависимости и (возможную) головную боль занимаюсь компиляцией / установкой модулей C.

0 голосов
/ 26 мая 2010

Я рекомендую свой рецепт

Структура данных XML to Python «Рецепты Python« Код ActiveState

Не ускоряет разбор. Но он обеспечивает действительно нативный доступ к стилю объекта.

>>> SAMPLE_XML = """<?xml version="1.0" encoding="UTF-8"?>
... <address_book>
...   <person gender='m'>
...     <name>fred</name>
...     <phone type='home'>54321</phone>
...     <phone type='cell'>12345</phone>
...     <note>&quot;A<!-- comment --><![CDATA[ <note>]]>&quot;</note>
...   </person>
... </address_book>
... """
>>> address_book = xml2obj(SAMPLE_XML)
>>> person = address_book.person


person.gender        -> 'm'     # an attribute
person['gender']     -> 'm'     # alternative dictionary syntax
person.name          -> 'fred'  # shortcut to a text node
person.phone[0].type -> 'home'  # multiple elements becomes an list
person.phone[0].data -> '54321' # use .data to get the text value
str(person.phone[0]) -> '54321' # alternative syntax for the text value
person[0]            -> person  # if there are only one <person>, it can still
                                # be used as if it is a list of 1 element.
'address' in person  -> False   # test for existence of an attr or child
person.address       -> None    # non-exist element returns None
bool(person.address) -> False   # has any 'address' data (attr, child or text)
person.note          -> '"A <note>"'
0 голосов
/ 26 мая 2010

lxml - это в основном расширенный набор ElementTree, поэтому вы можете начать с ElementTree, а затем, если у вас возникнут проблемы с производительностью или функциональностью, вы можете перейти на lxml.

Проблемы производительности могут быть изучены только вами, используя ваши собственные данные,

...