Вопрос:

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

python xml

7611 просмотра

12 ответа

2030 Репутация автора

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

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

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

Автор: saalon Источник Размещён: 02.08.2008 03:35

Ответы (12)


28 плюса

4152 Репутация автора

Решение

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

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

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

Автор: saint_groceon Размещён: 02.08.2008 04:01

31 плюса

14860 Репутация автора

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

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

Автор: Gareth Simpson Размещён: 02.08.2008 03:21

4 плюса

5090 Репутация автора

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

Автор: Matt Размещён: 02.08.2008 06:04

4 плюса

27934 Репутация автора

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

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

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

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

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

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

Автор: Matthew Schinckel Размещён: 03.08.2008 08:34

6 плюса

71 Репутация автора

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

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

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

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

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

Автор: Kent Quirk Размещён: 16.09.2008 04:35

1 плюс

491 Репутация автора

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

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

Автор: mbesso Размещён: 16.09.2008 06:20

6 плюса

0 Репутация автора

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

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

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

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

Автор: Tim Wyatt Размещён: 23.09.2008 07:42

1 плюс

312 Репутация автора

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

Автор: William McVey Размещён: 13.10.2008 10:17

6 плюса

1563 Репутация автора

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

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

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

Автор: giltay Размещён: 14.10.2008 06:26

5 плюса

11010 Репутация автора

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

Автор: Jabba Размещён: 31.10.2011 02:05

1 плюс

530 Репутация автора

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

Автор: Arcturus Размещён: 12.12.2012 03:25

3 плюса

31043 Репутация автора

Для серьезной работы с 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 за доли секунды.

Автор: Jan Vlcinsky Размещён: 17.04.2014 09:32
Вопросы из категории :
32x32