Подтвердить что ты не робот

Обработка XML в Python

Я собираюсь создать часть проекта, которая должна будет создать и разместить XML-документ в веб-службе, и я хотел бы сделать это на Python, чтобы расширить свои навыки в нем.

К сожалению, хотя я хорошо знаю XML-модель в .NET, я не уверен, что за и против есть модели XML в Python.

У кого-нибудь есть опыт выполнения обработки XML в Python? Где бы вы предложили мне начать? Файлы XML, которые я буду строить, будут довольно простыми.

4b9b3361

Ответ 1

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

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

Что мне нравится: вы можете обрабатывать синтаксический анализ в цикле for, а не использовать обратные вызовы. Вы также задерживаете полный синтаксический анализ (часть "pull" ) и получаете дополнительную информацию при вызове expandNode(). Это удовлетворяет моему общему требованию "ответственной" эффективности, не жертвуя простотой использования и простотой.

Ответ 2

ElementTree имеет хороший API-интерфейс pythony. Я думаю, что он даже отправлен как часть python 2.5

Он в чистом питоне и, как я говорю, довольно приятный, но если вам нужно больше производительности, то lxml предоставляет то же самое API и использует libxml2 под капотом. Вы можете теоретически просто поменять его, когда обнаружите, что вам это нужно.

Ответ 3

Dive Into Python содержит главу. Нельзя ручаться за то, насколько это было бы хорошо.

Ответ 4

Есть 3 основных способа работы с XML, в общем случае: dom, sax и xpath. Модель dom хороша, если вы можете сразу загрузить весь xml файл в память, и вы не против иметь дело с структурами данных, и вы смотрите на большую/большую часть модели. Сакс-модель отличная, если вы заботитесь только о нескольких тегах и/или имеете дело с большими файлами и можете обрабатывать их последовательно. Модель xpath - это немного каждая - вы можете выбирать пути к элементам данных, которые вам нужны, но для этого требуется больше библиотек.

Если вы хотите прямолинейно и упакованно с Python, минидомом является ваш ответ, но он довольно хромает, и документация "здесь docs на dom, идите". Это действительно раздражает.

Лично мне нравится cElementTree, что является более быстрой (с-основанной) реализацией ElementTree, которая является dom-подобной моделью.

Я использовал саксофонные системы, и во многих отношениях они более "пифоничны" в своем восприятии, но я обычно в конечном итоге создаю государственные системы для их обработки, и в этом заключается безумие (и ошибки).

Я говорю, идите с мини-министром, если вам нравятся исследования, или ElementTree, если вы хотите, чтобы хороший код работал хорошо.

Ответ 5

Я использовал ElementTree для нескольких проектов и рекомендую его.

Это pythonic, поставляется в коробке с Python 2.5, включая c версию cElementTree (xml.etree.cElementTree), которая в 20 раз быстрее, чем чистая версия Python, и очень проста в использовании.

lxml обладает некоторыми преимуществами, но они неравномерны, и вы должны сначала проверить тесты для своего варианта использования.

Как я понимаю, код ElementTree можно легко портировать в lxml.

Ответ 6

Это зависит от того, насколько сложным должен быть документ.

Я много раз использовал minidom для написания XML, но обычно это просто чтение документов, внесение некоторых простых преобразований и запись их обратно. Это работало достаточно хорошо, пока мне не понадобилась возможность упорядочивать атрибуты элементов (чтобы удовлетворить старое приложение, которое не анализирует XML правильно). В этот момент я сдался и сам написал XML.

Если вы работаете только с простыми документами, то сделать это самостоятельно можно быстрее и проще, чем изучать фреймворк. Если вы, возможно, можете написать XML вручную, тогда вы, вероятно, можете его закодировать и вручную (просто не забудьте правильно сбежать от специальных символов и используйте str.encode(codec, errors="xmlcharrefreplace")). Помимо этих snafus, XML достаточно регулярный, что вам не нужна специальная библиотека для его записи. Если документ слишком сложный для записи вручную, то вам, вероятно, следует взглянуть на одну из ранее упомянутых фреймворков. Ни в коем случае не нужно писать общий писатель XML.

Ответ 7

Вы также можете попробовать распутать для анализа простых XML-документов.

Ответ 8

Поскольку вы упомянули, что будете создавать "довольно простой" XML, модуль minidom (часть стандартной библиотеки Python), вероятно, удовлетворит ваши потребности. Если у вас есть опыт работы с представлением XML в DOM, вы должны найти API довольно простым.

Ответ 9

Я пишу SOAP-сервер, который получает XML-запросы и создает XML-ответы. (К сожалению, это не мой проект, поэтому это закрытый источник, но это другая проблема).

Для меня оказалось, что создание (SOAP) XML-документов довольно просто, если у вас есть структура данных, которая "соответствует" схеме.

Я сохраняю конверт, поскольку конверт ответа (почти) совпадает с конвертом запроса. Затем, поскольку моя структура данных представляет собой (возможно, вложенный) словарь, я создаю строку, которая превращает этот словарь в элементы <key> value </key>.

Это задача, которую рекурсия делает простой, и я в итоге получаю правильную структуру. Все это делается в коде Python и в настоящее время достаточно быстро для производственного использования.

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

Для меня это было намного проще, так как словарь - намного более простой способ работы, чем какой-либо пользовательский класс. Для книг генерирование XML намного проще, чем разбор!

Ответ 10

Я лично считаю, что глава из Погружение в Python великолепна. Сначала проверьте это - он использует модуль мини-модуля и является довольно хорошей записью.

Ответ 11

Для серьезной работы с XML в Python используйте lxml

Python поставляется со встроенной библиотекой ElementTree, но lxml расширяет ее с точки зрения скорости и функциональности (проверка схемы, синтаксический анализ, XPath, различные виды итераторов и многие другие функции).

Вы должны установить его, но во многих местах он уже считается частью стандартного оборудования (например, Google AppEngine не допускает пакеты Python на основе C, но делает исключение для lxml, pyyaml и некоторых других).

Создание XML-документов с помощью E-factory (из lxml)

Ваш вопрос о создании XML-документа.

В lxml есть много методов, и мне понадобилось некоторое время, чтобы найти тот, который кажется простым в использовании и легко читаемым.

Пример кода из документа lxml по использованию E-factory (слегка упрощенный):


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: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

Я ценю на E-factory следующие вещи

Код читается почти как полученный XML-документ

Читаемость имеет значение.

Позволяет создавать любой контент XML

Поддерживает такие вещи, как:

  • использование пространств имен
  • начальные и конечные текстовые узлы в одном элементе
  • функции форматирования содержимого атрибутов (см. func CLASS в полном примере 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 в том, что он должен быть скомпилирован. См. Ответ SO для получения дополнительных советов о том, как установить lxml из пакета формата wheel за доли секунды.

Ответ 12

Недавно я успешно использовал Amara.

Ответ 13

Я предполагаю, что .Net-способ обработки XML основан на некоторой версии MSXML, и в этом случае я предполагаю, что использование, например, minidom заставит вас чувствовать себя как дома. Однако, если вы выполняете простую обработку, возможно, подойдет любая библиотека.

Я также предпочитаю работать с ElementTree при работе с xml в Python, это очень аккуратная библиотека.

Ответ 14

Если вы собираетесь создавать сообщения SOAP, посмотрите soaplib. Он использует ElementTree под капотом, но он обеспечивает гораздо более чистый интерфейс для сериализации и десериализации сообщений.

Ответ 15

Я настоятельно рекомендую SAX - Simple API for XML - реализацию в библиотеках Python. Они довольно просты в настройке и обработке большого XML помощью даже управляемого API, как обсуждалось в предыдущих постерах, и занимают мало места в памяти, в отличие от проверки XML анализаторов в стиле DOM.

Ответ 16

Я думаю, вы должны использовать lxml для этой функции.