Обработка XML в Python [закрыто]

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

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

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

2.08.2008 03:35:55
У погружения в Python есть глава. Не могу ручаться за то, как хорошо это было бы все же.
Bernard 2.08.2008 03:43:33
Первый питон вопрос
Roshan 26.07.2019 17:01:10
12 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

28
2.08.2008 04:01:34
Разве pulldom не является инструментом для разбора XML, а не для его генерации (о чем вопрос?)
cunkel 20.09.2008 01:07:39

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

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

31
2.08.2008 15:21:03
Чтобы завершить свой ответ, можете ли вы добавить, что lxml также поддерживает XML-схему и XPath, которые не поддерживаются ElementTree? И это действительно поставляется с Python 2.5.
Torsten Marek 23.09.2008 21:09:50
ElementTree хорош, пока вам не нужно иметь дело с пространствами имен, тогда он разваливается и становится непригодным для использования.
Ryu 25.07.2009 22:45:56

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

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

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

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

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

6
16.09.2008 04:35:28
В Python есть и другие способы, такие как ElementTree (см. Ответ Гарета Симпсона)
bortzmeyer 15.10.2008 08:27:46

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

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

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

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

6
23.09.2008 19:42:58

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

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

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

6
14.10.2008 18:26:04

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

5
31.10.2011 14:05:09

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

4
2.08.2008 18:04:10

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

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

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

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

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

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

4
22.05.2019 00:27:38

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

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

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

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

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

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

Пример кода из документа lxml по использованию 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 за доли секунды.

3
22.05.2019 00:26:23

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

1
13.10.2008 22:17:10

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

1
25.07.2018 06:47:24

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

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

1
19.10.2018 18:14:09