Обработка XML в Python [закрыто]
Я собираюсь построить часть проекта, который должен будет построить и опубликовать XML-документ в веб-службе, и я хотел бы сделать это на Python, как средство для расширения моих навыков в нем.
к сожалению, хотя я знаю модель XML довольно хорошо в .NET, я не уверен, что плюсы и минусы XML-моделей в Python.
У кого-нибудь есть опыт обработки XML в Python? С чего бы ты предложил мне начать? XML-файлы, которые я буду строить, будут очень простой.
12 ответов:
лично я играл с несколькими встроенными опциями в XML-тяжелом проекте и остановился на pulldom как самый лучший выбор для более менее сложных документов.
особенно для небольших простых вещей, мне нравится событийная теория разбора, а не создание целого ряда обратных вызовов для относительно простой структуры. вот хорошее краткое обсуждение того, как использовать API.
что мне нравится: вы можете обрабатывать разбор в a
for
петли, а не с помощью обратных вызовов. Вы также задерживаете полный разбор (часть" pull") и получаете дополнительную информацию только при вызовеexpandNode()
. Это удовлетворяет мое общее требование к "ответственной" эффективности без ущерба для простоты использования и простоты.
ElementTree имеет хороший pythony API. Я думаю, что он даже поставляется как часть python 2.5
Это в чистом python и, как я уже сказал, довольно приятно, но если вам понадобится больше производительности, то lxml предоставляет тот же API и использует libxml2 под капотом. Теоретически вы можете просто поменять его, когда обнаружите, что вам это нужно.
есть 3 основных способа работы с XML, в целом: dom, sax и xpath. Модель dom хороша, если вы можете позволить себе загрузить весь xml-файл в память сразу, и вы не возражаете иметь дело со структурами данных, и вы смотрите на многое/большую часть модели. Модель sax отлично подходит, если вы заботитесь только о нескольких тегах, и/или вы имеете дело с большими файлами и можете обрабатывать их последовательно. Модель xpath-это немного каждого - вы можете выбрать и выбрать пути к элементам данных вам нужно,но для этого требуется больше библиотек.
Если вы хотите простой и упакованный с Python, minidom-это ваш ответ, но он довольно хромает, и документация "вот документы на dom, идите выясните это". Это действительно раздражает.
лично мне нравится cElementTree, который является более быстрой (c-based) реализацией ElementTree, которая является dom-подобной моделью.
Я использовал системы саксофон, и во многом они более "подходящие для Python" в их чувствую, но я обычно в конечном итоге создание государственных систем для их обработки, и таким образом лежит безумие (и ошибки).
Я говорю идти с minidom, если вы любите исследования, или ElementTree, если вы хотите хороший код, который хорошо работает.
Я использовал ElementTree для нескольких проектов и рекомендую его.
Это pythonic, поставляется "в коробке" с Python 2.5, включая версию c cElementTree (xml.etree.cElementTree), который в 20 раз быстрее, чем версия pure Python, и очень прост в использовании.
lxml имеет некоторые преимущества производительности, но они неравномерны, и вы должны сначала проверить тесты для вашего варианта использования.
Как я понимаю, код ElementTree можно легко портировать на lxml.
это немного зависит от того, насколько сложным должен быть документ.
Я много использовал minidom для написания XML, но обычно это просто чтение документов, выполнение некоторых простых преобразований и запись их обратно. Это работало достаточно хорошо, пока мне не понадобилась возможность упорядочивать атрибуты элементов (чтобы удовлетворить древнее приложение, которое не разбирает XML должным образом). В этот момент я сдался и написал XML сам.
Если вы работаете только на простых документы, то делать это самостоятельно может быть быстрее и проще, чем изучать основы. Если вы можете предположительно написать XML вручную, то вы, вероятно, можете также закодировать его вручную (просто не забудьте правильно экранировать специальные символы и использовать
str.encode(codec, errors="xmlcharrefreplace")
). Помимо этих snafus, XML является достаточно регулярным, что вы не нужно специальная библиотека для записи его. Если документ слишком сложен для написания от руки, то вам, вероятно, следует заглянуть в один из уже упомянутых фреймворков. На нет смысла, если вам нужно написать общие записи XML-файлов.
Так как вы упомянули, что вы будете строить "довольно простой" XML, то модуль minidom (часть стандартной библиотеки Python), скорее всего, удовлетворит ваши потребности. Если у вас есть какой-либо опыт работы с DOM-представлением XML, вы должны найти API довольно прямолинейно.
вы также можете попробовать ч для разбора простых XML-документов.
Я пишу SOAP-сервер, который получает XML-запросы и создает XML-ответы. (К сожалению, это не мой проект, так что это закрытый источник, но это еще одна проблема).
для меня оказалось, что создание XML-документов (SOAP) довольно просто, если у вас есть структура данных, которая "соответствует" схеме.
Я держу конверт, так как конверт ответа (почти) такой же, как конверт запроса. Затем, поскольку моя структура данных является (возможно, вложенным) словарем, Я создаю строку, которая превращает этот словарь в
value items. Это задача, которую рекурсия делает простой, и я в конечном итоге с правильной структурой. Все это делается в коде python, и в настоящее время достаточно быстро для использования в производстве.
вы также можете (относительно) легко создавать списки, хотя в зависимости от вашего клиента вы можете столкнуться с проблемами, если не дадите подсказки по длине.
для меня это было намного проще, так как словарь-это сильно более простой способ работы, чем некоторые пользовательские классы. Для книг генерация XML намного проще, чем разбор!
для серьезной работы с XML в Python используйте lxml
Python поставляется со встроенной библиотекой ElementTree, но lxml расширяет ее с точки зрения скорости и функциональности (проверка схемы, синтаксический анализ sax, XPath, различные итераторы и многие другие функции).
вы должны установить его, но во многих местах он уже считается частью стандартного оборудования (например, Google AppEngine не позволяет использовать пакеты Python на основе C, но делает исключение для lxml, pyyaml и нескольких другие.)
создание XML-документов с помощью E-factory (от lxml)
Ваш вопрос о создании XML-документа.
С lxml есть много методов, и мне потребовалось некоторое время, чтобы найти тот, который, кажется, прост в использовании, а также легко читается.
пример кода lxml doc при использовании E-factory (немного упрощенный):
электронная фабрика обеспечивает простой и компактный синтаксис для генерации XML и HTML:
>>> from lxml.builder import E >>> html = page = ( ... E.html( # create an Element called "html" ... E.head( ... E.title("This is a sample document") ... ), ... E.body( ... E.h1("Hello!"), ... E.p("This is a paragraph with ", E.b("bold"), " text in it!"), ... E.p("This is another paragraph, with a", "\n ", ... E.a("link", href="http://www.python.org"), "."), ... E.p("Here are some reserved characters: <spam&egg>."), ... ) ... ) ... ) >>> print(etree.tostring(page, pretty_print=True)) <html> <head> <title>This is a sample document</title> </head> <body> <h1>Hello!</h1> <p>This is a paragraph with <b>bold</b> text in it!</p> <p>This is another paragraph, with a <a href="http://www.python.org">link</a>.</p> <p>Here are some reserved characters: <spam&egg>.</p> </body> </html>
Я ценю на электронной фабрике это следующие вещи
код читается почти как результирующий XML-документ
читаемость имеет значение.
позволяет создавать любой XML-контент
поддерживает такие вещи, как:
- использование пространства имен
- начальные и конечные текстовые узлы в пределах одного элемента
- функции форматирования содержимого атрибута (см. Класс func в полный lxml образец)
позволяет очень читаемые конструкции со списками
например:
from lxml import etree from lxml.builder import E lst = ["alfa", "beta", "gama"] xml = E.root(*[E.record(itm) for itm in lst]) etree.tostring(xml, pretty_print=True)
в результате:
<root> <record>alfa</record> <record>beta</record> <record>gama</record> </root>
выводы
я настоятельно рекомендую прочитать учебник lxml - он очень хорошо написан и даст вам еще много причин использовать эту мощную библиотеку.
единственным недостатком lxml является то, что он должен быть скомпилирован. Смотрите поэтому ответьте на дополнительные советы как установить этот пакет содержит файлы с колеса форматирование пакета в течение доли секунды.
Я предполагаю, что .Net-способ обработки XML строится на версии som MSXML, и в этом случае я предполагаю, что использование, например, minidom заставит вас чувствовать себя как дома. Однако, если это простая обработка, которую вы делаете, любая библиотека, вероятно, будет делать.
Я тоже предпочитаю работать с ElementTree при работе с xml в Python, это очень аккуратная библиотека.
Если вы собираетесь создавать сообщения SOAP, проверьте soaplib. Он использует ElementTree под капотом, но он обеспечивает гораздо более понятный интерфейс для сериализации и десериализации сообщений.