Was macht dieser Code? (XML, ElementTree, namespaces)

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
Hase
User
Beiträge: 74
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Freitag 14. Februar 2020, 09:03

Hallo, ich arbeite in letzter Zeit viel mit XML-Dateien. Aber XML ohne namespaces ermitteln zu können ist nicht wirklich zielführend. LXML stellt hierfür die Funktion "nsmap" zur Verfügung. Doch auch ElementTree kann das, nämlich mit

Code: Alles auswählen

ns = dict([node for _, node in ET.iterparse(filename, events=['start-ns'])])
Das funktioniert gut, aber warum? Was hat es mit diesem "node for _, node in ..." auf sich? Kann mir jemand in Worten erklären, was das bedeutet?

Vielen Dank!
Sirius3
User
Beiträge: 11621
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 14. Februar 2020, 09:21

@Hase: was meinst Du damit? Hast Du Dir angeschaut, was iterparse zurückliefert? Geht es Dir um die Listcomprehension, die Du nicht verstehst?

Ich habe schon viel mit XML-Dateien gearbeitet, aber namespaces mußte ich auf diese Weise noch nie ermitteln. Wie ein Namespace in XML abgekürzt wird, ist nämlich irrelevant, einzig die URL ist bindend.
Hase
User
Beiträge: 74
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Freitag 14. Februar 2020, 09:32

Hallo, wenn ich ein Element aus der Datei suchen möchte, brauche ich den kompletten namespace

e = element.find(name, ns)

sonst wird nichts gefunden. Listcemprehensions sind mir schon bekannt, aber wofür steht das "_" ? Ist das ein Variablenname?
Hase
User
Beiträge: 74
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Freitag 14. Februar 2020, 09:36

Ah, sorry, das oben ist ich wirklich richtig. Die Suche sieht so aus:

e = element.find('gml:Envelope', ns)
Sirius3
User
Beiträge: 11621
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 14. Februar 2020, 09:55

Und das ist falsch. Niemand garantiert, dass `gml` immer `gml` heißt, oder dass `gml` an http://www.opengis.net/gml/3.2 gebunden ist.
Daher ist der richtige Aufruf mit einem fixen Namespace-Wörterbuch, das nicht aus dem XML gelesen wird:

Code: Alles auswählen

GML_NAMESPACES = {
    'irgendein_namespace_name': 'http://www.opengis.net/gml/3.2',
}

e = element.find('irgendein_namespace_name:Envelope', GML_NAMESPACES)
`irgendein_namespace_name` ist hier nur ein Beispiel, dass man irgendeinen Namespacenamen benutzen könnte, üblich ist wahrscheinlich gml, aber das ist halt nicht fest vorgegeben.

Das `_` steht für einen Variablennamen, wie jeder andere Variablenamen. Es ist Konvention, wenn an einer Stelle eine Variable stehen muß, die aber nicht gebraucht wird, den Namen `_` zu benutzen.
Antworten