geocaching.com GPX mit Python verarbeiten

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
DunkleAura
User
Beiträge: 1
Registriert: Sonntag 3. Mai 2009, 04:33

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

Code: Alles auswählen

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

Noch länger…

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

der Logtext[/b]</groundspeak:text>
        </groundspeak:log>
      </groundspeak:logs>
      <groundspeak:travelbugs />
    </groundspeak:cache>
  </wpt>
der teile mit [ b ] und [ / b ] interessieren mich.

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: Alles auswählen

#!/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()
ziel ist es am ende das ganze in eine 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.
aber bitte keine google links, ich glaube ich habe alles mögliche gegoogelt… ausser es ist etwas wirklich nützliches.

gruss DunkleAura
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Ich würd an Deiner Stelle lxml.etree hierfür benutzen. Damit kannst Du die Elemente entweder direkt anfragen via find()/findall() bzw. xpath() oder mit einem Walker mit getiterator() ablaufen. Wie mir scheint, brauchst Du fast alle Informationen der <wpt>-Elemente, dann wäre das Suchen dieser Elemente und Ablaufen aller Kinder wahrscheinlich die sinnvollste Herangehensweise, schematisch:

Code: Alles auswählen

from lxml import etree
parsed_doc = etree.parse(<dein dokument>)
root = parsed_doc.getroot()

# setze default namespace
standard_ns = root.nsmap[None]

# hole alle <wpt>
for wpt in root.findall(etree.QName(standard_ns, 'wpt')):
    # ab hier dann Walker
    for element in wpt.getiterator():
        # Daten auslesen
Beachten mußt Du, das lxml die Tags mit namespaces in der Form "{NS-URL}tag" versieht, für ein bestimmtes Element gesetzte namespaces bekommst Du mit element.nsmap und kannst den erweiterten Tag-Namen mit etree.QName(ns, tag) zusammensetzen (siehe Bsp. oben).

Grüsse, jerch
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Falls du nicht auf etree von lxml zurückgreifen kannst/willst, kannst du ElementTree aus der Std-Lib benützen

Code: Alles auswählen

import xml.etree.ElementTree
the more they change the more they stay the same
Antworten