• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

GPX mit Python verarbeiten

A

Anonymous

Gast
hallo leute,

ich habe eine frage, wie komme ich mit python an die folgenden elemente im xml dokument?

hier das vollständige GPX/XML dokument
http://dunkleaura.pastebin.ca/1691498 schrieb:
<wpt lat="47.9876" lon="7.8765">
<time>2007-05-19T00:00:00</time>
<name>GC130BG</name>
<desc>Einer cooler Tradi by Nickname Owner, Traditional Cache (2.5/2.5)</desc>
<url>http://www.geocaching.com/seek/cache_details.aspx?guid=GUID</url>
<urlname>Einer cooler Tradi</urlname>
<sym>Geocache Found</sym>
<type>Geocache|Traditional Cache</type>
<groundspeak:cache id="200001" available="False" archived="True" xmlns:groundspeak="http://www.groundspeak.com/cache/1/0">
<groundspeak:name>Einer cooler Tradi</groundspeak:name>
<groundspeak:placed_by>Nickname Owner</groundspeak:placed_by>
<groundspeak:eek:wner id="220001">Nickname Owner</groundspeak:eek:wner>
<groundspeak:type>Traditional Cache</groundspeak:type>
<groundspeak:container>Micro</groundspeak:container>
<groundspeak:difficulty>2.5</groundspeak:difficulty>
<groundspeak:terrain>2.5</groundspeak:terrain>
<groundspeak:country>Switzerland</groundspeak:country>
<groundspeak:state>Espace Mittelland (BE/SO)</groundspeak:state>
<groundspeak:short_description html="False">Das ist die kurze Beschreibung</groundspeak:short_description>
<groundspeak:long_description html="False">Sehr lange Beschreibung.

Noch länger…

Noch viel länger…
</groundspeak:long_description>
<groundspeak:encoded_hints>hier der hint</groundspeak:encoded_hints>
<groundspeak:logs>
<groundspeak:log id="210001">
<groundspeak:date>2007-09-02T07:00:00</groundspeak:date>
<groundspeak:type>Found it</groundspeak:type>
<groundspeak:finder id="220002">Nickname Cacher</groundspeak:finder>
<groundspeak:text encoded="False">Hier

der Logtext
</groundspeak:text>
</groundspeak:log>
</groundspeak:logs>
<groundspeak:travelbugs />
</groundspeak:cache>
</wpt>
der fette teil ist der mich interessiert.

nur weiss ich leider nicht wie ich das zeugs da aus dem anderen namespace raus kriege, da XML leider nicht so mein ding ist…

das ganze ist hier auch farbig zu finden
Code:
#!/usr/bin/env python
# -*- coding: utf8 -*-
# das GPX File "myfinds.gpx" aufbau http://dunkleaura.pastebin.ca/1691498
from xml.dom import minidom, Node

gpxfile = 'myfinds.gpx'

def getText(nodelist):
	rc = ""
	for node in nodelist:
		if node.nodeType == node.TEXT_NODE:
			rc = rc + node.data
	return rc

def handleText(wpt, elem):
	return "%s" % getText(wpt.getElementsByTagName(elem)[0].childNodes)

def handlePocketQuery(pocketQuery):
	handlePocketQueryTitle(pocketQuery.getElementsByTagName("name")[0])
	wpts = pocketQuery.getElementsByTagName("wpt")
	handleWaypoints(wpts)

def handlePocketQueryTitle(title):
	print "%s" % getText(title.childNodes)
	print '-' * 80 + "\n"

def handleWaypoints(wpts):
	print 'Waypoint Names:'
	print '-' * 80
	for wpt in wpts:
		handleWaypoint(wpt)

def handleWaypoint(wpt):
	print handleText(wpt, 'name') + '  \t' + handleText(wpt, 'desc')
	print '-' * 80
	print handleText(wpt, 'url') + '\n'

def main():
	datei = open(gpxfile, "r")
	dom = minidom.parse(datei)
	datei.close()
	handlePocketQuery(dom)

if __name__ == '__main__':
	main()
das ziel ist am ende das ganze in einer sqlite3 datenbank zu speichern.
ich dachte mir löse erst mal den XML teil, denn der sqlite3 teil wird recht einfach werden.

ich wäre für jede hilfe dankbar.

gruss DunkleAura
 
Hast Du schon mal unter den folgenden Stichworten bei z.B. google gesucht?
"xml to sqlite3"
"xml parser python"
 
OP
A

Anonymous

Gast
HBtux schrieb:
Hast Du schon mal unter den folgenden Stichworten bei z.B. google gesucht?
"xml to sqlite3"
"xml parser python"
natürlich nicht! ;-) (zumindest nach dem ersten…)



und deswegen fragte ich auch ganz höflich hier nach, ob mir jemand helfen kann…
weil jedes beispiel ist nur mit "flachem" xml also ohne namespaces und so…
 
Anregung an die Mods: Nach "Programmierung" verschieben.

Hallo,

hier also mal ein Anfang (nicht bis zuende geschrieben, da es doch allmählich aufwendig wurde):
Code:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# das GPX File "myfinds.gpx" aufbau http://dunkleaura.pastebin.ca/1691498

import xml.dom
import xml.dom.minidom

class GpxParser:

    def __init__(self):

        self.gpxfile = 'myfinds.gpx'
        fh = file(self.gpxfile, "r")
        self.dom = xml.dom.minidom.parse(fh)
        fh.close()

        self.names = ("time",
                      "name",
                      "url",
                      "groundspeak:name",
                      "groundspeak:placed_by",
                      "groundspeak:owner",
                      "groundspeak:type",
                      "groundspeak:short_description html")

        self.textvals = {}
        self.attributevals = {}

        self.walkTree(self.dom)
        self.printVals()

    def walkTree(self, localrootnode):

        for node in localrootnode.childNodes:

            if node.nodeName in self.names:
               self.processFoundNodes(node)

            self.walkTree(node)

    def processFoundNodes(self, node):

        for i in node.childNodes:
            if i.nodeType == i.TEXT_NODE:
                self.textvals[node.nodeName] = i.nodeValue.strip()

        for i in node.attributes.keys():
            self.attributevals[node.nodeName] = { i : node.attributes[i].nodeValue.strip() }

    def printVals(self):

        for i in self.textvals.keys():
            print i, self.textvals[i]
            if i in self.attributevals.keys():
                print "Attributes of '" + i + "':"
                for u in self.attributevals[i].keys():
                    print u, self.attributevals[i][u]
            print

if __name__ == '__main__':
    GpxParser()
Beachte, daß die Methode ".walkTree()" rekursiv ist, sich also immer wieder selbst aufruft. Das ist typisch, wenn man eine Baumstruktur durchlaufen will (wie z.B. bei "find").
Welche Stelle des Baumes ("namespace") Du durchläufst, hängt davon ab, welchen Knoten ("Node") Du ".walkTree()" als "localrootnode" (meine Namensgebung) übergibst.
Es kann sein, daß Du da erst noch eine Routine schreiben mußt, um den richtigen "localrootnode" zu finden. Derzeit ist es der oberste Dokumentknoten, das heißt, das gesamte Dokument wird durchlaufen, was Du wahrscheinlich nicht willst.
Folgende Dokumente habe ich verwendet:

http://de.wikibooks.org/wiki/Python_unter_Linux:_XML#XML_lesen
http://www.boddie.org.uk/python/XML_intro.html
http://pyxml.sourceforge.net/topics/howto/section-DOM.html

"xml.dom.minidom" ist inzwischen etwas aus der Mode gekommen. Viele verwenden lxml / ElementTree.
Ich bleibe aber bei minidom (das heißt, mit lxml könnte ich Dich nicht unterstützen).

Viele Grüße
 
OP
A

Anonymous

Gast
danke abgdf,

ich werde mir morgen (also heute aber später) den script teil und die links zu gemüte führen und mich weiter einarbeiten.

gruss DunkleAura
 
Oben