Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1726
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4399
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
XML обработка в Python
Я собираюсь построить часть проекта, который должен будет построить и разместить документ XML в веб-сервисе, и я хотел бы сделать это в Python, чтобы расширить свои навыки в этом.
К сожалению, хотя я довольно хорошо знаю модель XML в .NET, я не уверен, каковы плюсы и минусы моделей XML в Python.
У кого-нибудь есть опыт выполнения обработки XML в Python? С чего бы вы посоветовали мне начать? Файлы XML, которые я буду создавать, будут довольно простыми.
ElementTree имеет хороший питон API. Я думаю, что он даже поставляется как часть python 2.5
Это в чистом виде python и, как я уже сказал, довольно приятно, но если вам нужно больше производительности, то lxml выставляет тот же API и использует libxml2 под капотом. Теоретически вы можете просто поменять его, когда обнаружите, что он вам нужен.
Лично я играл с несколькими встроенными опциями в тяжелом проекте XML и остановился на pulldom как лучшем выборе для менее сложных документов.
Особенно для небольших простых вещей, мне нравится событийная теория синтаксического анализа, а не создание целого ряда обратных вызовов для относительно простой структуры. Вот хорошее краткое обсуждение того, как использовать API .
Что мне нравится: вы можете обрабатывать синтаксический анализ в цикле for , а не использовать обратные вызовы. Вы также задерживаете полный синтаксический анализ (часть "pull") и получаете дополнительную информацию только при вызове expandNode() . Это удовлетворяет моему общему требованию к эффективности "responsible" без ущерба для простоты использования и простоты.
Есть 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, если вы хотите хороший код, который хорошо работает.
Это немного зависит от того, насколько сложным должен быть документ.
Я часто использовал minidom для написания XML, но обычно это было просто чтение документов, выполнение некоторых простых преобразований и запись их обратно. Это работало достаточно хорошо, пока мне не понадобилась возможность упорядочивать атрибуты элементов (чтобы удовлетворить древнее приложение, которое не разбирает XML должным образом). В этот момент я сдался и сам написал XML.
Если вы работаете только с простыми документами, то сделать это самостоятельно может быть быстрее и проще, чем изучать фреймворк. Если вы можете предположительно написать XML вручную, то вы, вероятно, можете также закодировать его вручную (просто не забудьте правильно экранировать специальные символы и использовать str.encode(codec, errors="xmlcharrefreplace") ). Помимо этих проблем, XML достаточно регулярна, чтобы вам не нужна была специальная библиотека для ее написания. Если документ слишком сложен для написания от руки, то вам, вероятно, следует заглянуть в один из уже упомянутых фреймворков. Ни в коем случае вам не нужно писать общий XML писатель.
Я использовал ElementTree для нескольких проектов и рекомендую его.
Это pythonic, поставляется "в коробке" с Python 2.5, включая версию c cElementTree (xml.etree.cElementTree), которая в 20 раз быстрее, чем чистая версия Python, и очень проста в использовании.
lxml имеет некоторые преимущества производительности, но они неравномерны, и вы должны сначала проверить критерии для вашего варианта использования.
Насколько я понимаю, код ElementTree можно легко перенести в lxml.
Поскольку вы упомянули, что будете строить "fairly simple" XML, модуль minidom (часть стандартной библиотеки Python), скорее всего, будет соответствовать вашим потребностям. Если у вас есть какой-либо опыт работы с DOM представлением XML, вы должны найти API довольно прямолинейным.
Я пишу сервер SOAP, который получает XML запросов и создает XML ответ. (К сожалению, это не мой проект, поэтому он является закрытым исходным кодом, но это еще одна проблема).
Для меня оказалось, что создание (SOAP) XML документов довольно просто, если у вас есть структура данных, которая "fits" схема.
Я храню конверт, так как конверт ответа (почти) совпадает с конвертом запроса. Затем, поскольку моя структура данных является (возможно, вложенным) словарем, я создаю строку, которая превращает этот словарь в <key>value</key> элементов.
Это задача, которую рекурсия делает простой, и я в конечном итоге получаю правильную структуру. Все это делается в коде python и в настоящее время достаточно быстро для производственного использования.
Вы также можете (относительно) легко создавать списки, хотя в зависимости от вашего клиента, вы можете столкнуться с проблемами, если не дадите подсказки длины.
Для меня это было гораздо проще, так как словарь-это гораздо более простой способ работы, чем какой-то пользовательский класс. Для книг генерация XML намного проще, чем синтаксический анализ!
Для серьезной работы с 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: <spam&egg>.</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 .
Я предполагаю, что .Net-способ обработки XML строится на некоторой версии MSXML, и в этом случае я предполагаю, что использование, например, minidom заставит вас чувствовать себя как дома. Однако, если это простая обработка, которую вы делаете, любая библиотека, вероятно, подойдет.
Я также предпочитаю работать с ElementTree, когда имею дело с xml в Python, это очень аккуратная библиотека.