Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

ЭлементДерево имеет хороший API Pythony.Я думаю, что он даже включен в состав Python 2.5.

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

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

Если вам нужен простой и упакованный с Python, ваш ответ — minidom, но он довольно унылый, а документация такая: «вот документация по dom, идите и разбирайтесь».Это действительно раздражает.

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

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

Я советую использовать Minidom, если вам нравятся исследования, или ElementTree, если вам нужен хороший код, который хорошо работает.

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

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

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

Насколько я понимаю, код ElementTree легко портируется на lxml.

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

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

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

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

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

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

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

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

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

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

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

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

Python поставляется со встроенной библиотекой ElementTree, но lxml расширяет ее с точки зрения скорости и функциональности (проверка схемы, анализ sax, 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 является то, что его необходимо компилировать.Видеть ТАК ответьте, чтобы получить дополнительные советы как установить lxml из пакета формата колеса за доли секунды.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top