Обробка XML на Python [закрито]


77

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

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

Хтось має досвід роботи з обробкою XML у Python? З чого б ви мені запропонували почати? XML-файли, які я будуватимуть, будуть досить простими.


Занурення в Python має розділ. Не можу гарантувати, наскільки це було б добре.
Бернард

4
Перше запитання на пітона
Рошан

Відповіді:


31

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

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

Що мені подобається: ви можете обробляти синтаксичний аналіз у forциклі, а не використовувати зворотні виклики. Ви також затримуєте повний синтаксичний аналіз (частина "витягування") і отримуєте додаткові деталі лише під час дзвінка expandNode(). Це задовольняє мої загальні вимоги щодо "відповідальної" ефективності, не жертвуючи простотою використання та простотою.


Хіба не pulldom - це інструмент для синтаксичного аналізу XML, а не його генерування (саме про це задається питання)?
cunkel

31

ElementTree має приємний API pythony. Я думаю, що він навіть поставляється як частина python 2.5

Це чистий python, і, як я вже кажу, дуже приємний, але якщо вам потрібна більша продуктивність, тоді lxml виставляє той самий API і використовує libxml2 під капотом. Теоретично ви можете просто поміняти його місцями, коли виявите, що це вам потрібно.


1
Щоб завершити свою відповідь, чи можете ви додати, що lxml також підтримує XML-схему та XPath, що не підтримується ElementTree? І він справді постачається з Python 2.5.
Торстен Марек

2
ElementTree хороший, поки вам не доведеться мати справу з просторами імен, тоді він розвалюється і непридатний для використання.
Рю,

6

Загалом існує 3 основних способи роботи з XML: dom, sax та xpath. Модель dom хороша, якщо ви можете дозволити собі завантажувати весь файл xml відразу в пам’ять, і ви не проти зайнятися структурами даних, і ви розглядаєте більшу частину / більшу частину моделі. Модель sax чудова, якщо ви дбаєте лише про кілька тегів та / або ви маєте справу з великими файлами і можете їх обробляти послідовно. Модель xpath - це трохи по кожному - ви можете обирати шляхи до потрібних вам елементів даних, але для використання потрібно більше бібліотек.

Якщо ви хочете зрозуміти і впакувати Python, minidom - це ваша відповідь, але вона досить кульгава, а документація - "ось документи на dom, розбирайтеся". Це справді дратує.

Особисто мені подобається cElementTree, який є більш швидкою (на основі c) реалізацією ElementTree, яка є домоподібною моделлю.

Я використовував саксофонні системи, і багато в чому вони більш "пітонічні" у своєму відчутті, але зазвичай я в кінцевому підсумку створюю державні системи для їх обробки, і таким чином лежить божевілля (і помилки).

Я кажу: піди з мінідом, якщо ти любиш дослідження, або ElementTree, якщо хочеш хороший код, який добре працює.


У Python існують інші способи, такі як ElementTree (див. Відповідь Гарета Сімпсона)
bortzmeyer

6

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

Він pythonic, поставляється в коробці з Python 2.5, включаючи версію cElementTree (xml.etree.cElementTree), яка в 20 разів швидша за чисту версію Python і дуже проста у використанні.

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

Як я розумію, код ElementTree можна легко перенести на lxml.


6

Це трохи залежить від того, наскільки складним повинен бути документ.

Я багато використовував мінідом для написання XML, але це, як правило, просто читання документів, виконання деяких простих перетворень і виписування їх назад. Це працювало досить добре, поки мені не знадобилася можливість упорядковувати атрибути елементів (щоб задовольнити стародавню програму, яка не аналізує XML належним чином). На той момент я здався і сам написав XML.

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



4

Оскільки ви вже згадували, що будете створювати "досить простий" XML, модуль minidom (частина стандартної бібліотеки Python), швидше за все, відповідатиме вашим потребам. Якщо у вас є досвід роботи з представленням DOM XML, вам слід знайти API цілком прямим.


4

Я пишу сервер SOAP, який отримує запити XML і створює відповіді XML. (На жаль, це не мій проект, тому закритий, але це інша проблема).

Для мене виявилося, що створення (SOAP) XML-документів досить просте, якщо у вас є структура даних, яка "відповідає" схемі.

Я зберігаю конверт, оскільки конверт відповіді (майже) такий самий, як конверт запиту. Потім, оскільки моя структура даних є (можливо, вкладеним) словником, я створюю рядок, який перетворює цей словник на елементи <key> значення </key>.

Це завдання, яке рекурсія робить простим, і в підсумку я отримую правильну структуру. Все це робиться в коді python і на даний момент досить швидко для виробничого використання.

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

Для мене це було набагато простіше, оскільки словник - це набагато простіший спосіб роботи, ніж якийсь спеціальний клас. Для книг створення XML набагато простіше, ніж синтаксичний розбір!


3

Для серйозної роботи з 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 із пакета формату колеса за долі секунди, див. У розділі SO-відповідь .


1

Якщо ви збираєтеся створювати SOAP-повідомлення, перевірте soaplib . Він використовує ElementTree під кришкою, але він забезпечує набагато чистіший інтерфейс для серіалізації та десеріалізації повідомлень.


1

Настійно рекомендую SAX - Simple API for XML- реалізацію в бібліотеках Python. Вони досить легко встановити і обробляти великі XMLза ініціативою навіть API, як обговорювалося в попередніх плакатів тут, і мають низький обсяг пам'яті в відміну від перевірки DOMстилю XMLпарсеров.


1

Я припускаю, що .NET-спосіб обробки XML ґрунтується на якійсь версії MSXML, і в цьому випадку я припускаю, що використання, наприклад, мінідом допоможе вам почуватись як вдома. Однак якщо ви виконуєте просту обробку, можливо, це зробить будь-яка бібліотека.

Я також вважаю за краще працювати з ElementTree, коли маю справу з XML в Python, оскільки це дуже акуратна бібліотека.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.