Сведения о вопросе

SOON

16:03, 1st July, 2020

Теги

python   xml    

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

Просмотров: 589   Ответов: 12

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

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

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



  Сведения об ответе

DINO

18:03, 1st July, 2020

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

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


  Сведения об ответе

SILA

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

VERSUION

18:03, 1st July, 2020

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

Если вы хотите простой и упакованный с Python, minidom-это ваш ответ, но он довольно хромает, а документация-это "here's docs on dom, go figure it out". Это действительно раздражает.

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

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

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


  Сведения об ответе

ЯЯ__4

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

dumai

18:03, 1st July, 2020

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

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

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

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


  Сведения об ответе

SSESION

18:03, 1st July, 2020

Вы также можете попробовать распутать , чтобы разобрать простые документы XML.


  Сведения об ответе

dumai

18:03, 1st July, 2020

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


  Сведения об ответе

SSESION

18:03, 1st July, 2020

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

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

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

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

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

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


  Сведения об ответе

SSESION

18:03, 1st July, 2020

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

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

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

Построение XML документов с электронной фабрикой (от 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: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

Я ценю на электронной фабрике это следующие вещи

Код читается почти как результирующий документ 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 из пакета wheel format в течение доли секунды см. В разделе SO answer .


  Сведения об ответе

LAST

18:03, 1st July, 2020

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

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


  Сведения об ответе

baggs

18:03, 1st July, 2020

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


  Сведения об ответе

lats

18:03, 1st July, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться