xml file auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

xml file auslesen

Beitragvon pot » Samstag 4. August 2007, 14:25

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
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Beitragvon pythonist » Samstag 4. August 2007, 14:48

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Samstag 4. August 2007, 19:27

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.
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Beitragvon pot » Samstag 4. August 2007, 19:52

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? ;)
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Beitragvon pot » Samstag 4. August 2007, 20:39

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?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Samstag 4. August 2007, 22:24

@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=]>>> a=b=[]
>>> a.append(1)
>>> b.append(3)
>>> a
[1, 3]
>>> b
[1, 3][/code]Deshalb besser:

Code: Alles auswählen

vars = []
formeln = []
MfG
HWK
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Beitragvon pot » Samstag 4. August 2007, 22:31

@HWK: Stimmt hab ich auch bemerkt. Habs dann auch so gelöst aber vergessen hier zu erwähnen.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]