lxml + gpx zusammenstellen

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
myoggradio
User
Beiträge: 15
Registriert: Freitag 20. November 2020, 12:24

Guten Tag,
möchte gerne einen gpx Track mit lxml zusammenstellen.
Folgendes habe ich versucht:

Code: Alles auswählen

from lxml import etree
root = etree.Element("gpx")
root.set("version","1.1")
root.set("creator","http://www.myoggradio.org")
root.set("xmlns","http://www.topografix.com/GPX/1/1")
root.set("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")
root.set("xsi:schemaLocation","http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd")
metadata = etree.Element("metadata")
root.append(metadata)
name = etree.Element("name")
name.text = "Ein GPX Track pywv Alpha Test"
metadata.append(name)
trk = etree.Element("trk")
root.append(trk)
trkseg = etree.Element("trkseg")
trk.append(trkseg)
trkpt = etree.Element("trkpt")
trkpt.set("lat","7.2")
trkpt.set("lon","51.9")
ele = etree.Element("ele")
ele.text = "0.0"
trkpt.append(ele)
tim = etree.Element("tim")
tim.text=("Zeitstempel")
trkpt.append(tim)
trkseg.append(trkpt)
print(etree.tostring(root,encoding="UTF-8"))
Leider nimmt lxml die Attribute für den Namespace so nicht an. Es kommen die Fehlermeldungen:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Anwendungen\python\xml\first.py", line 6, in <module>
    root.set("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")
  File "src\lxml\etree.pyx", line 816, in lxml.etree._Element.set
  File "src\lxml\apihelpers.pxi", line 585, in lxml.etree._setAttributeValue
  File "src\lxml\apihelpers.pxi", line 1744, in lxml.etree._attributeValidOrRaise
ValueError: Invalid attribute name 'xmlns:xsi'
Wie kann man die Namespace Attribute nun erstellen?
Gruß Christian
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

Du solltest wirklich erst lesen, wie lxml bedient wird und vor allem, wie man mit Namespaces arbeitet: https://lxml.de/tutorial.html#namespaces

Und auch wenn das Format gerne kryptische Abkürzungen verwendet, bedeutet das nicht, dass man das für Variablennamen übernehmen muß:

Code: Alles auswählen

from lxml import etree
GPX_NS = "{http://www.topografix.com/GPX/1/1}"

root = etree.Element(f"{GPX_NS}gpx", version="1.1", creator="http://www.myoggradio.org", nsmap={None: GPX_NS[1:-1]})
root.set("{http://www.w3.org/2001/XMLSchema-instance}schemaLocation", f"{GPX_NS[1:-1]} http://www.topografix.com/GPX/1/1/gpx.xsd")
metadata = etree.SubElement(root, f"{GPX_NS}metadata")
etree.SubElement(metadata, f"{GPX_NS}name").text = "Ein GPX Track pywv Alpha Test"
track = etree.SubElement(root, f"{GPX_NS}trk")
tracksegment = etree.SubElement(track, f"{GPX_NS}trkseg")
trackpoint = etree.SubElement(tracksegment, f"{GPX_NS}trkpt", lat="7.2", lon="51.9")
etree.SubElement(trackpoint, f"{GPX_NS}ele").text = "0.0"
etree.SubElement(trackpoint, f"{GPX_NS}tim").text = "Zeitstempel"
print(etree.tostring(root, encoding="UTF-8"))
Mit etwas Magie, auch so:

Code: Alles auswählen

from lxml.builder import ElementMaker
GPX_NS = "http://www.topografix.com/GPX/1/1"

E = ElementMaker(namespace=GPX_NS, nsmap={None: GPX_NS})
root = E.gpx(version="1.1", creator="http://www.myoggradio.org")
root.set("{http://www.w3.org/2001/XMLSchema-instance}schemaLocation", f"{GPX_NS} http://www.topografix.com/GPX/1/1/gpx.xsd")
root.append(E.metadata(E.name("Ein GPX Track pywv Alpha Test")))
root.append(E.trk(
    E.trkseg(
        E.trkpt(E.ele("0.0"), E.tim("Zeitstempel"), lat="7.2", lon="51.9")
    )
))
myoggradio
User
Beiträge: 15
Registriert: Freitag 20. November 2020, 12:24

Vielen Dank für die Hinweise,
das hilft mir weiter.
Wünsche noch frohe Weihnachten und einen guten Rutsch.
Gruß Christian
Antworten