XML File gezielte Daten 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.
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

Donnerstag 19. Juni 2008, 12:13

Hallo Pythonianer,

ich weiss es gibt schon sehr viel Infos über XML und Python,
nur find ich nix, was meinen Vorstellungen entsrpicht...

Vielleicht hat ja einer von euch noch nen Link oder ein Beispiel für mich...

XML-file:

Code: Alles auswählen

<environment>
	<Informations>
		<Name>bla</Name>
		<Version>blub</Version>
		<Date>date</Date>
	</Informations>
	[color=red]<Variables>
		<Var>
			<Name>RestartMode</Name>
			<Value>Only necessary</Value>
		</Var>
		<Var>
			<Name>Languages_Order</Name>
			<Value>German</Value>
			<Options>;English;</Options>
		</Var>
		<Var>
			<Name>Path_Test</Name>
			<Value>T:\Testing\t</Value>
		</Var>
		
	</Variables>[/color]
	<Tests>
		<UserManagement>
			<Case>
				<Name>01_Show_Existing_Users</Name>
				<Selected>True</Selected>
				<Params></Params>
				<Comments>this is my comments</Comments>
			</Case>
		</UserManagement>
	</Tests>
</environment>

Ich will jetzt, dass mir nur Variables/Name ausgegeben wird, sonst nichts. Also soll als Ergebnis:

Code: Alles auswählen

RestartMode
Languages_Order
angezeigt werden.

Ich habe natürlich schon so manches rausgefunden und verwende nun Elementtree.

Hier mein Code:

Code: Alles auswählen

from xml.dom.minidom import*                    
from elementtree import ElementTree as et

files = file("C:\Python25\Test.xml", "r")
etree = et.parse(files)
files.close()
root_tag = etree.getroot()
files_tag = root_tag.find("Variables")
if files_tag:
    for file_tag in files_tag.findall("Var"):
        print file_tag.get("Name")
        print "  " + (file_tag.text or "")
und als Ergebnis kommt :

Code: Alles auswählen

None

None
Was fehlt da noch, dass ich an die Info komme
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 19. Juni 2008, 12:36

Denk noch mal über Zeile 12 nach ... "was macht das get() eigentlich?". Schau da noch mal in die Doku.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Donnerstag 19. Juni 2008, 12:49

Code: Alles auswählen

from xml.etree import ElementTree as et 

xml = et.parse(open('x.xml', 'r'))

variables = xml.find('Variables')
for elem in variables.findall('Var'):
    print elem.tag, elem.text
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

Donnerstag 19. Juni 2008, 13:12

hmmm, also das funzt ja schon, nur bekomm ich nicht den Inhalt aus "Var" angezeigt,geschweigedenn den eingentlichen Inhalt von Name, also "RestartMode" und "Languages_Order" sondern:

Code: Alles auswählen

Var


Var
Ich müsste also noch eine Hirarchieebene weiter runter.

Code: Alles auswählen

<Variables>
        <Var>
            <Name>RestartMode</Name>
            <Value>Only necessary</Value>
        </Var>
        <Var>
            <Name>Languages_Order</Name>
            <Value>German</Value>
            <Options>;English;</Options>
        </Var>
        <Var>
            <Name>Path_Test</Name>
            <Value>T:\Testing\t</Value>
        </Var>
       
    </Variables>
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

Donnerstag 19. Juni 2008, 13:36

Hab die Lösung gefunden und schreib sie hier rein, für alle, die mal an das gleiche Problem stossen:

Code: Alles auswählen

xml = et.parse(open("C:\...", 'r')) # hier den Pfad des XML-Files eingeben
variables = xml.find('Variables')  
for elems in variables.findall('Var'):
    var = elems
    for elem in var.findall("Name"):
        print elem.tag, elem.text
danke an alle Beteiligten
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Freitag 20. Juni 2008, 11:20

Ich hab grad mal dein Skript ausprobiert, da ich ein ähnliches Problem wie aus dem ersten Post habe/hatte.

Jedenfalls wenn ich das Skript nach meinen Wünschen umbaue, was nur bei dem Punkt variables und nach was gesucht werden soll der Fall ist, bekomme ich als Ausgabe das irgendein Modul nicht gefunden wurde.

Hier mal mein Code:

Code: Alles auswählen

from xml.dom.minidom import*
from elementtree import ElementTree as et

xml = et.parse(open("C:\dateipfad\eigeneRM_3.rm", 'r')) # hier den Pfad des XML-Files eingeben
variables = xml.find('Stations')
for elems in variables.findall('Station'):
    var = elems
    for elem in var.findall("Point"):
        print elem.tag, elem.text
Jedenfalls bekomme ich in folgendes dann angezeigt:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\dateipfad\eigeneRM_3.rm", line 4, in <module>
    from elementtree import ElementTree as et
ImportError: No module named elementtree
Kann mir jemand bitte sagen, was ich falsch mache, oder was noch dazu geschrieben werden muss???
Ach ja, nicht wundern, wegen der "rm"-Datei. Das ist wirklich eine XML-Datei und kein Video ;-)


LG

Daniela
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 20. Juni 2008, 11:55

Code: Alles auswählen

from xml.dom.minidom import*
from elementtree import ElementTree as et
...
Wozu denn noch der minidom import?
Versuche einfach mal:

Code: Alles auswählen

from xml.etree import ElementTree
Wie es Audax ja auch schon gemacht hat ;-) Ich vermute dass Du Python 2.5 hast, wohingegen der Threadsteller wohl noch mit einer 2.4er arbeitet.

Ich hoffe das hilft :-)
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Freitag 20. Juni 2008, 12:12

Ach echt :shock:
Wusst ich jetzt nicht.

Wenn ich die Zeile 2 lösche, dann bekomme ich aber dennoch den gleichen Hinweis, wie vorher nur das jetzt der Fehler nciht mehr in Zeile 4 ist, sondern in Zeile 3.

Ich werd mir jetz mal das von audax trotzdem nochmal genauer anschauen.

Aber danke für den Hinweis.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 20. Juni 2008, 12:30

Dann sag doch mal bitte, welche Python-Version Du hast. ElementTree ist erst sei 2.5 dabei (laut meiner Doku). Wenn Du auch diese Version hast, dann sollte das von Audax klappen.

Wenn Du < 2.5 hast, musst Du das Paket erst nachinstallieren und dann ist ggf. der andere import der richtige.

Ob ein Paket verfügbar ist, testet man am besten per Konsole.
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Freitag 20. Juni 2008, 13:13

Eigentlich hab ich Python 2.5

Und wenn ich das von audax nehme, kommt der gleiche Fehler.
BlackJack

Freitag 20. Juni 2008, 15:39

Falls das mit dem Importieren dann irgend wann klappt, kann man die Schleife über die Stationen auch mit einem `findall()` machen:

Code: Alles auswählen

from xml.etree import ElementTree as etree

def main():
    doc = etree.parse('test.xml')
    result = list()
    for station in doc.findall('stations/station'):
        point = station.find('point')
        result.append((station.get('name'),
                      (int(point.get('x')), int(point.get('y')))))
    print result
Bei mir sind die Tags klein geschrieben, weil das in einem anderen Thema im Forum bei einem gegebenen Beispiel auch so war.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 20. Juni 2008, 18:54

Daniela hat geschrieben:Eigentlich hab ich Python 2.5
Und uneigentlich? ;-) Starte doch mal in der Shell

Code: Alles auswählen

python -V
(Sofern python im PATH steht, ansonsten eben direkt die .exe aufrufen.) Unter Linux sollte Python eh im Pfad stehen.
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Montag 23. Juni 2008, 07:11

auch uneigentlich hab ich Python 2.5.2!!!

Ich arbeite über windows! Windows XP, falls das wichtig ist?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 23. Juni 2008, 10:28

Kannst Du bitte noch einmal eine Konsolen-Session starten und die genaue Meldung per copy und paste hier reinstellen? So kommen wir nicht weiter ...
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Montag 23. Juni 2008, 10:47

Keine Ahnung warum, aber wenn ich mein Skript jetzt ausführe, bekomme ich keine Fehlermeldung mehr, dass irgendein Modul nicht gefunden wurde.

Jedenfalls läuft es aber immer noch nicht so, wie ich es gern hätte. Bei meinem Code erhalte ich trotzdem immernoch ne Fehlermeldung, dass die Datei nicht gefunden wurde.

Code: Alles auswählen

from xml.etree import ElementTree as et

xml = et.parse(open("C:\Dokumente und Einstellungen\Benutzer\Dokumentenpfad\eigeneRM3.rm", 'r')) #allgemein gehalten
variables = xml.find('Stations')
for elems in variables.findall('Station'):
    var = elems
    for elem in var.findall("Point"):
        print elem.tag, elem.text
Ich muss aber noch dazu sagen, dass mein Dokumentenpfad etwas lang ist. Insgesamt erstreckt sich der Pfad auf 8 Unterordner. Ist das vielleicht zu viel???
Denn wenn ich es jetzt ausführe, dann bekomme ich folgendes:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\gast_82z\workspace\betoscan\src\MeanderMovement.py", line 3, in <module>
    xml = et.parse(open("C:\Dokumente und Einstellungen\Benutzer\Dokumentenpfad\eigeneRM3.rm", 'r')) # hier den Pfad des XML-Files eingeben
IOError: [Errno 2] No such file or directory: 'C:\\Dokumente und Einstellungen\\Benutzer\\Dokumentenpfad\\eigeneRM3.rm'
Es kann aber eigentlich nicht sein, da die Datei wirklich in dem von mir angegebenen Pfad liegt.

Ich wär ja schon mal froh, wenn die Datei gefunden wird und irgendeinen der abgespeicheten Werte ausliest, damit ich damit dann weiterarbeiten könnte. Wenigstens den ersten.

Daniela
Antworten