Zpracování XML v Pythonu

hlasů
61

Chystám se stavět kus projektu, který se bude muset postavit a psát XML dokumentu do webové služby a rád bych, aby to v Pythonu, jak chce rozšířit své dovednosti v něm.

Bohužel, zatímco já vím, model XML docela dobře v .NET, jsem nejistý, jaké výhody a nevýhody jsou XML modelů v Pythonu.

Každý, kdo má zkušenosti s tím zpracování XML v Pythonu? Kam byste navrhovali mám začít? Soubory XML budu budova bude poměrně jednoduchý.

Položena 02/08/2008 v 04:35
zdroj uživatelem
V jiných jazycích...                            


16 odpovědí

hlasů
30

ElementTree má pěknou pythony API. Myslím, že to dokonce dodáván jako součást pythonu 2.5

Je to v čistém Pythonu, a jak říkám, docela pěkné, ale pokud jste skončili potřebovat větší výkon, pak LXML vystavuje stejný API a používá libxml2 pod kapotou. Můžete teoreticky stačí vyměnit ho, když zjistíte, že ji budete potřebovat.

Odpovězeno 02/08/2008 v 16:21
zdroj uživatelem

hlasů
22

Osobně jsem hrál s několika vestavěných možností na projektu XML-těžký a se usadili na pulldom jako nejlepší volbou pro méně složitých dokumentů.

Speciálně pro malé jednoduché věci, mám rád event-driven teorii analýze spíše než nastavení celý zabil zpětná volání pro relativně jednoduchou konstrukci. Zde je dobrá rychlá diskuse o tom, jak pomocí rozhraní API .

Co se mi líbí: můžete zvládnout parsování ve forsmyčce, spíše než používat zpětná volání. Také odložit úplné analýze (část „pull“) a pouze získat další podrobnosti, když zavoláte expandNode(). To splňuje mé obecný požadavek na „odpovědné“ účinnost, aniž by byla obětována snadnost použití a jednoduchost.

Odpovězeno 02/08/2008 v 05:01
zdroj uživatelem

hlasů
6

Dive Into Python má kapitolu. Nemůže ručit za to, jak dobře to bude ačkoli.

Odpovězeno 02/08/2008 v 04:43
zdroj uživatelem

hlasů
5

Záleží trochu na tom, jak složitý dokument potřebuje být.

Použil jsem minidom hodně pro psaní XML, ale to je většinou už jen číst dokumenty, dělat několik jednoduchých transformací, a psaní je zpátky ven. To fungovalo docela dobře, dokud jsem potřeboval schopnost objednat atributy prvků (pro uspokojení starověké aplikaci, která nefunguje správně analyzovat XML). V té chvíli jsem to vzdal a napsal jazyka XML sám.

Pokud pracujete pouze na jednoduchých dokumentů, pak to dělá sám může být rychlejší a jednodušší než se učit rámec. Pokud můžete představit, psát XML ručně, pak můžete pravděpodobně kódovat jej ručně stejně (stačí vzpomenout na správné uniknout speciální znaky a použití str.encode(codec, errors="xmlcharrefreplace")). Na rozdíl od těchto snafus, XML je dost, že nemáte pravidelný potřebovat speciální knihovnu ji psát. V případě, že dokument je příliš složitý psát ručně, pak byste měli asi podívat do jednoho z rámců již zmínil. V žádném okamžiku by se budete muset napsat obecný XML spisovatel.

Odpovězeno 14/10/2008 v 19:26
zdroj uživatelem

hlasů
5

Použil jsem ElementTree na několika projektech a doporučuji.

Je to pythonic, přichází ‚v poli‘ Python 2.5, včetně c verze cElementTree (xml.etree.cElementTree), což je 20krát rychlejší než čisté Python verze, a je velmi snadné použití.

LXML má některé výhody Perfomance, ale jsou nerovnoměrné a měli byste nejprve zkontrolovat kritéria pro váš případ použití.

Jak jsem pochopil, ElementTree kód lze snadno přenést do LXML.

Odpovězeno 23/09/2008 v 20:42
zdroj uživatelem

hlasů
5

Existují 3 hlavní způsoby, jak se vypořádat s XML, obecně: dom, saxofon, a XPath. Model dom je dobré, pokud si můžete dovolit nahrát celý soubor XML do paměti najednou, a vám nevadí, že jednání s datovými strukturami, a vy se díváte na mnoho / většina modelů. Model sax je skvělé, pokud jste jen o několik značek a / nebo máte co do činění s velkými soubory a může zpracovávat postupně. Model XPath je trochu na sobě - ​​můžete si vybrat cesty k datové prvky, které potřebujete, ale to vyžaduje více knihoven použít.

Pokud chcete, jednoduché a baleny s Python, minidom je vaše odpověď, ale je to docela lame, a dokumentace je „tady je docs na dom, jdi na to přijít.“ Je to opravdu nepříjemné.

Osobně jsem rád cElementTree, což je rychlejší (c-based) realizace ElementTree, což je model dom-like.

Použil jsem saxofon systémy, a v mnoha ohledech jsou více „pythonic“ ve svém pocitu, ale já obvykle skončí vytváření státní systémy založené s nimi pracovat, a to tak leží šílenství (a chyby).

Já říkám jít s minidom chcete-li výzkum, nebo ElementTree pokud chcete dobrý kód, který funguje dobře.

Odpovězeno 16/09/2008 v 05:35
zdroj uživatelem

hlasů
4

Můžete také zkusit rozmotat analyzovat jednoduché XML dokumenty.

Odpovězeno 31/10/2011 v 15:05
zdroj uživatelem

hlasů
4

Píšu SOAP serveru, který přijímá požadavky na XML, a vytváří odpovědi XML. (Bohužel, to není můj projekt, takže je to uzavřený zdroj, ale to je jiný problém).

Ukázalo se, že pro mě, že vytvoření (SOAP) XML dokumentů je poměrně jednoduchá, pokud máte datovou strukturu, která „padne“ schématu.

Pořád obálku, protože obálka odpověď je (téměř) stejný jako obálka požadavku. Potom, protože můj datová struktura je (případně vnořené) slovník, jsem vytvořit řetězec, který změní tento slovník do <key> hodnota </ ​​KEY> předmětů.

To je úkol, který rekurze je jednoduché, a já skončit s pravou strukturou. To všechno se děje v Pythonu, a je v současné době dostatečně rychlý pro produkční použití.

Můžete také (relativně) snadno vytvářet seznamy stejně, i když v závislosti na klientovi, můžete zasáhnout problémy, pokud si dát délky rady.

Pro mě to bylo mnohem jednodušší, protože slovník je mnohem jednodušší způsob práce, než nějaké vlastní třídy. U knih, generování XML je mnohem jednodušší, než rozebrat!

Odpovězeno 03/08/2008 v 09:34
zdroj uživatelem

hlasů
3

Pro seriózní práci s XML v Pythonu použití LXML

Python je dodáván s vestavěným ElementTree v knihovně, ale LXML ji prodlouží, pokud jde o rychlost a funkčnost (ověření schématu, saxofon rozebrat, XPath, různé druhy iterátorů a mnoho dalších funkcí).

Musíte ji nainstalovat, ale na mnoha místech je již považován za součást standardní výbavy (např Google AppEngine nepovoluje Python balíky C-založené, ale dělá výjimku LXML, pyyaml ​​a několik dalších).

Budování XML dokumentů s E-továrny (od LXML)

Vaše otázka je o budování XML dokumentu.

S LXML existuje mnoho metod a trvalo mi chvíli najít ten, který se zdá být snadno ovladatelné a také snadno čitelné.

Ukázkový kód z LXML doc o používání e-factory (mírně zjednodušeno):


E-továrna poskytuje jednoduchý a kompaktní syntaxe pro vytváření XML a 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>

Oceňuji na E-factory it tyto věci

Kód čte téměř jako výsledný dokument XML

Čitelnost počítá.

Umožňuje tvorbu jakéhokoli obsahu XML

Podporuje věci jako:

  • Použití jmenných prostorů
  • začínající a končící textových uzlů do jednoho prvku
  • Funkce formátování obsahu atributu (viz func třída v plném vzorku LXML )

Umožňuje velmi čitelné konstrukty s takovým seznamem

např:

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)

což má za následek:

<root>
  <record>alfa</record>
  <record>beta</record>
  <record>gama</record>
</root>

závěry

Velmi doporučuji přečtení LXML tutorial - je to velmi dobře napsané a dá vám mnoho dalších důvodů, proč používat tento výkonný knihovnu.

Jedinou nevýhodou LXML je, že musí být sestaven. Viz SO zodpovídat za více tipů , jak nainstalovat LXML z formátu kolo balíčku v rámci zlomku vteřiny.

Odpovězeno 17/04/2014 v 22:32
zdroj uživatelem

hlasů
3

Já osobně si myslím, že kapitola z toho ponořit do Pythonu je skvělá. Zkontrolujte, zda se první - používá modul minidom a je to docela dobrý kus psaní.

Odpovězeno 11/08/2008 v 19:02
zdroj uživatelem

hlasů
3

Vzhledem k tomu, jste se zmínil, že budete stavět „poměrně jednoduchý“ XML, tím minidom modul (součást Python standardní knihovny) bude pravděpodobně vyhovovat vašim potřebám. Pokud máte nějaké zkušenosti s DOM reprezentaci XML, měli byste najít API poměrně přímočará.

Odpovězeno 02/08/2008 v 19:04
zdroj uživatelem

hlasů
1

Myslím, že byste měli používat LXML tohoto functionallity

Odpovězeno 08/10/2014 v 06:58
zdroj uživatelem

hlasů
1

Doporučuji SAX - Simple API pro XML - provádění v Pythonu knihovny. Jsou poměrně snadné nastavení a zpracování velkých XML tím i poháněného API, jak je popsáno v předchozích plakátů tady, a mají nízkou nároky na paměť na rozdíl od ověřování DOM stylu XML analyzátory.

Odpovězeno 12/12/2012 v 04:25
zdroj uživatelem

hlasů
1

Pokud se chystáte být budování SOAP zpráv, podívejte se soaplib . Využívá ElementTree pod kapotou, ale poskytuje mnohem čistší rozhraní pro serializaci a deserializing zpráv.

Odpovězeno 13/10/2008 v 23:17
zdroj uživatelem

hlasů
1

Domnívám se, že Net-way of zpracování XML staví na'som verze MSXML, a to, že případ se domnívám, že s použitím například minidom by se budete cítit trochu jako doma. Nicméně, pokud je to jednoduché zpracování děláte jakoukoli knihovnu budou pravděpodobně dělat.

Já taky dává přednost práci s ElementTree při práci s XML v Pythonu, je to velmi elegantní knihovnu.

Odpovězeno 16/09/2008 v 07:20
zdroj uživatelem

hlasů
1

Nedávno jsem začal používat Amara s úspěchem.

Odpovězeno 11/08/2008 v 23:40
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more