XML-Element 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.
Antworten
fPol
User
Beiträge: 7
Registriert: Montag 23. September 2013, 10:29

Hallo,

ich habe folgendes XML, aus dem ich genau einen String auslesen möchte:

<?xml version="1.0" encoding="utf-8"?>
<wps:ExecuteResponse xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wp ... sponse.xsd" service="WPS" version="1.0.0" xml:lang="en-CA" serviceInstance="http://vm249.rz.uos.de/cgi-bin/wps.py?s ... sion=1.0.0" statusLocation="http://vm249.rz.uos.de/wpsoutput/pywps-138053632309.xml">
<wps:Process wps:processVersion="0.1">
<ows:Identifier>wollny_pollmueller_abschluss_2</ows:Identifier>
<ows:Title>TinReducer Aufgabe 1</ows:Title>
<ows:Abstract>reduces the points of a given triangulated irregular networkby a variable factor and returns it as GML</ows:Abstract>
</wps:Process>
<wps:Status creationTime="2013-09-30T12:18:45Z">
<wps:ProcessSucceeded>PyWPS Process wollny_pollmueller_abschluss_2 successfully calculated</wps:ProcessSucceeded>
</wps:Status>
<wps:ProcessOutputs>
<wps:Output>
<ows:Identifier>output1</ows:Identifier>
<ows:Title>computation time (to compare different approaches)</ows:Title>
<wps:Data>
<wps:LiteralData dataType="integer">2.08</wps:LiteralData>
</wps:Data>
</wps:Output>
<wps:Output>
<ows:Identifier>data_output</ows:Identifier>
<ows:Title>Output vector data</ows:Title>
<wps:Reference href="http://vm249.rz.uos.de/wpsoutput/data_o ... re1VB5.gml" mimeType="text/xml"/>
</wps:Output>
</wps:ProcessOutputs>
</wps:ExecuteResponse>

Alles was ich brauche ist der Wert von "href", also die url zum Output meines Prozesses.
Ich brauche das für eine Aufgabe, die heute Abend abgegeben werden muss und schaffe es leider nicht mehr, mich mit XML parsen
allgemein zu beschäftigen.

Ich würde mich freuen, wenn mir jemand helfen könnte!

Grüße
fPol
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@fPol: Dir bleibt aber hoffentlich noch Zeit, die ElementTree-Dokumentation durchzulesen.
fPol
User
Beiträge: 7
Registriert: Montag 23. September 2013, 10:29

Ich hab aus dem XML einen Tree erzeugt, aber hab noch Probleme mit dem Zugriff.
Über "tree.findall(".//wps:Reference") sollte ich doch eigentlich das richtige Element bekommen?! Es
wird aber nur einen leere Menge zurückgeliefert.
BlackJack

@fPol: Das 'wps:' ist falsch, so werden die Namensräume in dem Elementbaum nicht angegeben. Das wäre ja auch nicht eindeutig, weil man das 'wps' an beliebiger Stelle in einer XML-Datei neu/umdefinieren könnte, so dass nicht jedes 'wps:' für den selben Namensraum stehen muss. Andersherum könnte man für den selben Namensraum auch verschiedene Präfixe definieren.

Schau Dir einfach mal ein paar Elemente in dem Elementbaum an, dann siehst Du wie Du den vollen Namen qualifizieren kannst/musst.

Generell nach ”dem” <Reference>-Objekt zu suchen ist nicht wirklich robust. Da kann es ja mehrere geben. Oder eines, das aber eine andere Bedeutung hat. Man trifft da halt ziemlich mutige Annahmen über die XML-Datei.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Bei Verwendung von lxml und den Daten in der Datei data.xml könnte das etwa so aus aussehen.

Code: Alles auswählen

from lxml import etree

def main():
    doc = etree.parse('data.xml')
    path = '/wps:ExecuteResponse/wps:ProcessOutputs/wps:Output/wps:Reference'
    nodes = doc.xpath(path,
                      namespaces={'wps': 'http://www.opengis.net/wps/1.0.0'})
    for node in nodes:
        print(node.get('href'))

if __name__ == '__main__':
    main()
Antworten