Seite 1 von 1

xml file auslesen

Verfasst: Samstag 4. August 2007, 14:25
von pot
Hallo python-forum

Tja ich würde gerne ein XML File mit python auslesen und in Variablen und Listen speichern. Leider finde ich keine gute (deutsche) Dokumentation oder Tutorial dazu. Hab zwar schon die englische Dokumentation versucht zu verstehen, da geht aber wirklich nichts mehr :-(

Dies ist das XML File:

Code: Alles auswählen

<forx version="0.1.1" id="1001">
        <name>Hebel</name>
        <grundgesetz>F1 * l1 = F2 * l2</grundgesetz>
        <var_anzahl>4</var_anzahl>
        <beschreibung>Mit einem Hebel kann man Schwere Lasten heben.</beschreibung>
        <wikipedialink>http://de.wikipedia.org/wiki/Hebelgesetz</wikipedialink>
        <for var="F1">F2 * l2 / l1</for>
        <for var="l1">F2 * l2 / F1</for>
        <for var="F2">F1 * l1 / l2</for>
        <for var="l2">F1 * l1 / F2</for>
</forx>
Nun soll alles in den Tags name, grundgesetz, var_anzahl, beschreibung und wikipedialink in je eine Variable gespeichert werden. Die Anzahl der for Tags variieren, deshalb müssen die irgendwie dynamisch ausgelesen werden können. Alles, was in dem for Tag steht, soll in der Liste formeln gespeichert werden. Alles, was in der Attribute var steht, soll in der Liste vars gespeichert werden.

So soll es schussendlich aussehen:

Code: Alles auswählen

vars = ["F1", "l1", "F2", "l2"]
formeln = ["F2 * l2 / l1", "F2 * l2 / F1", "F1 * l1 / l2", "F1 * l1 / F2"]
Könnte mir jemand einen Ratschlag geben oder einen Link zu einer guten deutschen Dokumentation?
Wäre euch sehr dankbar.

Grüsse
Pot

Verfasst: Samstag 4. August 2007, 14:48
von pythonist
Hi,

mit BeautifulSoup geht das folgendermaßen:

Code: Alles auswählen

from BeautifulSoup import BeautifulStoneSoup

xml = """<forx version="0.1.1" id="1001"> 
        <name>Hebel</name> 
        <grundgesetz>F1 * l1 = F2 * l2</grundgesetz> 
        <var_anzahl>4</var_anzahl> 
        <beschreibung>Mit einem Hebel kann man Schwere Lasten heben.</beschreibung> 
        <wikipedialink>http://de.wikipedia.org/wiki/Hebelgesetz</wikipedialink> 
        <for var="F1">F2 * l2 / l1</for> 
        <for var="l1">F2 * l2 / F1</for> 
        <for var="F2">F1 * l1 / l2</for> 
        <for var="l2">F1 * l1 / F2</for> 
</forx>"""

soup = BeautifulStoneSoup(xml).find("forx")

name = soup.find("name").string

grundgesetz = soup.find("grundgesetz").string

var_anzahl = soup.find("var_anzahl").string

beschreibung = soup.find("beschreibung").string

wikilink = soup.find("wikipedialink").string

vars = formeln = []
for f in soup.findAll("for"):
    
    vars.append(f["var"])
    formeln.append(f.string)
    

print name, grundgesetz, var_anzahl, beschreibung, wikilink, vars, formeln
Sollte eigentlich alles selbserklärend sein.

pythonist

Verfasst: Samstag 4. August 2007, 19:27
von Y0Gi
BeautifulSoup scheint mir da nicht der richte Ansatz, da es primär zum toleranten Parsen von HTML gedacht ist. Für sauberes XML empfehle ich ElementTree, das ja auch ab der aktuellen Python-Version mitgeliefert wird und eine sehr einfache API hat.

Verfasst: Samstag 4. August 2007, 19:52
von pot
Danke pythonist für den Ansatz, werde ich mal versuchen umzusetzen.


@Y0Gi: Gibt es dazu eine deutsche Doku oder eine Englische, die man auch mit Schulenglisch versteht? ;)

Verfasst: Samstag 4. August 2007, 20:39
von pot
Hab da noch kleine Verständisprobleme. Auch möchte ich die Attributen vom forx Tag auslesen. Sowas wie das hier geht aber nicht:

Code: Alles auswählen

xml = """<forx version="0.1.1" id="1001"> ...."""
soup = BeautifulStoneSoup(xml)
print soup.find("forx").string
Nur das schon gibt "none" aus. Soweit ich das verstanden habe, sollte das ganze File ausser das forx und /forx Tag ausgeben. Wieso?

Verfasst: Samstag 4. August 2007, 22:24
von HWK
@pythonist: Zeile 27 ist problematisch. vars und formeln beziehen sich auf dasselbe Objekt, d.h. vars.append() und formeln.append() verändern auch beide dies Objekt, so dass vars und formeln identisch bleiben.

Code: Alles auswählen

>>> a=b=[]
>>> a.append(1)
>>> b.append(3)
>>> a
[1, 3]
>>> b
[1, 3]
Deshalb besser:

Code: Alles auswählen

vars = []
formeln = []
MfG
HWK

Verfasst: Samstag 4. August 2007, 22:31
von pot
@HWK: Stimmt hab ich auch bemerkt. Habs dann auch so gelöst aber vergessen hier zu erwähnen.