Seite 1 von 1

lxml + gpx zusammenstellen

Verfasst: Mittwoch 23. Dezember 2020, 06:49
von myoggradio
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

Re: lxml + gpx zusammenstellen

Verfasst: Mittwoch 23. Dezember 2020, 08:14
von Sirius3
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")
    )
))

Re: lxml + gpx zusammenstellen

Verfasst: Mittwoch 23. Dezember 2020, 10:30
von myoggradio
Vielen Dank für die Hinweise,
das hilft mir weiter.
Wünsche noch frohe Weihnachten und einen guten Rutsch.
Gruß Christian