XML Processing i Python

stemmer
65

Jeg er i ferd med å bygge opp et stykke av et prosjekt som må konstruere og legge et XML-dokument til en web-tjeneste, og jeg vil gjerne gjøre det i Python, som et middel for å utvide mine ferdigheter i det.

Dessverre, mens jeg vet XML-modellen ganske godt i .NET, jeg er usikker på hva fordeler og ulemper er av XML-modeller i Python.

Alle som har erfaring gjør XML behandling i Python? Hvor ville du foreslå jeg begynne? XML-filer jeg skal bygge vil være ganske enkel.

Publisert på 02/08/2008 klokken 03:35
kilden bruker
På andre språk...                            


16 svar

stemmer
32

ElementTree har en fin pythony API. Jeg tror det er enda levert som en del av python 2,5

Det er i ren python og som jeg sier, ganske fin, men hvis du ender opp som trenger mer ytelse, så LXML eksponerer samme API og bruker libxml2 under panseret. Du kan teoretisk bare bytte den i når du oppdager at du trenger det.

Svarte 02/08/2008 kl. 15:21
kilden bruker

stemmer
26

Personlig har jeg spilt med flere av de innebygde opsjoner på en XML-heavy prosjekt, og har avgjort på pulldom som det beste valget for mindre komplekse dokumenter.

Spesielt for små enkle ting, jeg liker hendelsesdrevet teori om tolking i stedet for å sette opp en hel haug med tilbakeanrop for en relativt enkel struktur. Her er en god rask diskusjon om hvordan du bruker API .

Hva jeg liker: kan du håndtere parsing i en forsløyfe stedet for å bruke tilbakeanrop. Du kan også forsinke fulle parsing ( "pull" delen) og bare få ekstra detalj når du ringer expandNode(). Dette tilfredsstiller min generelle kravet for "ansvarlig" effektivitet uten å ofre brukervennlighet og enkelhet.

Svarte 02/08/2008 kl. 04:01
kilden bruker

stemmer
8

Dive Into Python har et kapittel. Kan ikke gå god for hvor godt det ville være skjønt.

Svarte 02/08/2008 kl. 03:43
kilden bruker

stemmer
6

Det avhenger litt av hvor komplisert dokumentet trenger å være.

Jeg har brukt minidom mye for å skrive XML, men det er som regel vært bare å lese dokumenter, gjøre noen enkle transformasjoner, og skrive dem ut igjen. Som fungerte bra nok før jeg trengte muligheten til å bestille element attributter (for å tilfredsstille en gammel program som ikke analysere XML riktig). På det tidspunktet jeg ga opp og skrev XML meg selv.

Hvis du bare jobber på enkle dokumenter, så gjør det selv kan være raskere og enklere enn å lære et rammeverk. Hvis du tenkes kan skrive XML for hånd, så kan du sannsynligvis kode det for hånd også (bare husk å skikkelig unnslippe spesialtegn, og bruk str.encode(codec, errors="xmlcharrefreplace")). Bortsett fra disse snafus, er XML vanlig nok til at du ikke trenger en spesiell bibliotek for å skrive det. Hvis dokumentet er for komplisert til å skrive for hånd, så du bør nok se nærmere på en av de rammene som allerede er nevnt. Ikke på noe tidspunkt bør du trenger å skrive en generell XML forfatter.

Svarte 14/10/2008 kl. 18:26
kilden bruker

stemmer
6

Jeg har brukt ElementTree for flere prosjekter og anbefaler det.

Det er Pytonske, kommer i boksen 'med Python 2,5, herunder c versjon cElementTree (xml.etree.cElementTree) som er 20 ganger raskere enn den rene Python versjon, og er meget enkel å bruke.

LXML har noen perfomance fordeler, men de er ujevn, og du bør sjekke benchmarks først for din bruk tilfelle.

Som jeg forstår det, kan ElementTree kode lett bli portet til LXML.

Svarte 23/09/2008 kl. 19:42
kilden bruker

stemmer
6

Det er 3 store måter å håndtere XML, generelt: dom, sax, og XPath. DOM-modellen er bra hvis du har råd til å laste inn hele xml filen inn i minnet på en gang, og du ikke har noe imot å håndtere datastrukturer, og du ser på mye / mesteparten av modell. Sax modellen er flott hvis du bare bryr seg om noen koder, og / eller du arbeider med store filer og kan behandle dem sekvensielt. XPath-modellen er litt av hvert - du kan velge og vrake veier til dataelementene du trenger, men det krever flere biblioteker for å bruke.

Hvis du vil ha enkel og pakket med Python, er minidom svaret, men det er ganske teit, og dokumentasjonen er "her er docs på dom, gå finne ut av det". Det er veldig irriterende.

Personlig liker cElementTree, som er en hurtigere (c basert) implementering av ElementTree, som er en dom-lignende modell.

Jeg har brukt sax-systemer, og på mange måter er de mer "Pytonske" i sin følelse, men jeg ender som regel opp med å skape statsbaserte systemer for å håndtere dem, og på den måten ligger galskap (og bugs).

Jeg sier gå med minidom hvis du liker forskning, eller ElementTree hvis du ønsker god kode som fungerer godt.

Svarte 16/09/2008 kl. 04:35
kilden bruker

stemmer
5

Du kan også prøve gre analysere enkle XML-dokumenter.

Svarte 31/10/2011 kl. 14:05
kilden bruker

stemmer
5

Siden du nevnte at du skal bygge "ganske enkelt" XML, den minidom modul (del av Python Standard Library) vil trolig dekke dine behov. Hvis du har noen erfaring med DOM representasjon av XML, bør du finne API ganske rett frem.

Svarte 02/08/2008 kl. 18:04
kilden bruker

stemmer
4

Jeg skriver en SOAP serveren som mottar XML forespørsler, og skaper XML svar. (Dessverre, det er ikke mitt prosjekt, så det er lukket kildekode, men det er et annet problem).

Det viste seg for meg at det å skape (SOAP) XML-dokumenter er ganske enkelt, hvis du har en datastruktur som "passer" skjemaet.

Jeg holder konvolutten, siden respons konvolutten er (nesten) den samme som den forespørselen konvolutten. Deretter, siden min datastruktur er en (muligens nestet) ordliste, lager jeg en streng som slår denne ordboken til <nøkkel> verdi </ nøkkel> eks.

Dette er en oppgave som rekursjon gjør enkle, og jeg ender opp med riktig struktur. Dette er gjort i python kode, og er for tiden rask nok for bruk i produksjon.

Du kan også (relativt) enkelt bygge lister også, selv avhengig av din klient, kan du treffer problemer med mindre du gir lengde hint.

For meg var dette mye enklere, siden en ordbok er en mye enklere måte å jobbe på enn noen egendefinert klasse. For bøkene, genererer XML er mye enklere enn parsing!

Svarte 03/08/2008 kl. 08:34
kilden bruker

stemmer
3

For seriøst arbeid med XML i Python bruk LXML

Python kommer med ElementTree bygget i bibliotek, men LXML strekker det gjelder hastighet og funksjonalitet (skjemavalidering, sax parsing, XPath, ulike former for iteratorer og mange andre funksjoner).

Du må installere det, men mange steder er det allerede antas å være en del av standardutstyret (f.eks Google AppEngine tillater ikke C-baserte Python-pakker, men gjør unntak for LXML, pyyaml ​​og noen andre).

Bygge XML-dokumenter med E-fabrikk (fra LXML)

Spørsmålet ditt er om å bygge XML-dokument.

Med LXML det er mange metoder, og det tok meg en stund å finne en, som synes å være enkel å bruke og lett å lese.

Eksempelkode fra LXML doc på ved hjelp av E-fabrikk (noe forenklet):


E-fabrikken gir en enkel og kompakt syntaks for å generere XML og 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>

Jeg setter pris på E-fabrikken det følgende ting

Kode leser nesten som den resulterende XML-dokument

Lesbarhet teller.

Tillater opprettelse av noe XML-innhold

Støtter ting som:

  • bruk av navnerom
  • begynner og slutter tekstnoder i løpet av ett element
  • funksjoner formatering attributt innhold (se func CLASS i fullt LXML prøve )

Gir meget lesbare konstruksjoner med lister

f.eks:

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)

resulterer i:

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

konklusjoner

Jeg anbefaler å lese LXML tutorial - det er veldig godt skrevet, og vil gi deg mange flere grunner til å bruke denne kraftige biblioteket.

Den eneste ulempen med LXML er, at det skal utarbeides. Se SO svare for flere tips hvordan du installerer LXML fra hjulet format pakken innenfor brøkdelen av et sekund.

Svarte 17/04/2014 kl. 21:32
kilden bruker

stemmer
3

Jeg personlig tror at kapittel fra Dykk ned Python er stor. Sjekk det ut først - den bruker minidom modul og er et ganske godt stykke skrive.

Svarte 11/08/2008 kl. 19:02
kilden bruker

stemmer
1

Jeg tror du bør bruke LXML for functionallity

Svarte 08/10/2014 kl. 05:58
kilden bruker

stemmer
1

Jeg anbefaler på det sterkeste SAX - Simple API for XML- implementering i Python bibliotekene. De er ganske enkelt å sette opp og behandle store XMLav selv drevet API, som omtalt av tidligere plakater her, og har lite minne fotavtrykk i motsetning validere DOMstil XMLparsere.

Svarte 12/12/2012 kl. 03:25
kilden bruker

stemmer
1

Hvis du skal bygge SOAP meldinger, sjekk ut soaplib . Den bruker ElementTree under panseret, men det gir en mye renere grensesnitt for seriefunksjon og deserializing meldinger.

Svarte 13/10/2008 kl. 22:17
kilden bruker

stemmer
1

Jeg antar at .Net-måte å behandle XML bygger på'som versjon av MSXML og det at saken jeg antar at bruk av for eksempel minidom ville gjøre at du føler deg litt hjemme. Men hvis det er enkelt å behandle du gjør noen biblioteket vil sannsynligvis gjøre.

Jeg også foretrekker å arbeide med ElementTree når du arbeider med xml i Python, er det en veldig ryddig bibliotek.

Svarte 16/09/2008 kl. 06:20
kilden bruker

stemmer
1

Jeg har nylig begynt å bruke Amara med suksess.

Svarte 11/08/2008 kl. 22:40
kilden bruker

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