Nonstandard-Attributnamen in xml.etree.ElementTree

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Die Methoden xml.etree.ElementTree.Element und .SubElement haben in etwa folgende Signaturen:

Code: Alles auswählen

import xml.etree.ElementTree as ET
el = ET.Element(elementname,  attributname1="wert1",attributname2="wert2",...)
sel = ET.SubElement(vaterelementname,elementname,  attributname1="wert1",attributname2="wert2",...)

Nun muss ich zuweilen XML-Dokumente erstellen mit Attributnamen, die nicht die Form eines zulässigen Python-Bezeichners haben, zum Beispiel "xmlns:xlink" oder "stroke-width" oder "from". Wie kriege ich das hin?

Die einzige Vorgehensweise die mir einfällt ist, diese Attribute zunächst einmal anders zu nennen (zum Beispiel "xmins_xlink" und "stroke_width" und "from_"), und in einem zweiten Durchlauf die gesamte XML-Datei durchzuscannen und die falschbenannten Attribute umzubenennen. Aber das kommt mir unelegant und fehleranfällig vor (es könnte versehentlich mehr umbenannt werden als erwünscht). Geht es vielleicht auch einfacher und sicherer?
Zuletzt geändert von Goswin am Montag 27. Februar 2012, 20:26, insgesamt 1-mal geändert.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Das kannst du mit einem Dictionary machen:

Code: Alles auswählen

attrs = {"stroke:width" : 123}
ET.Element(elementname, **attrs)
Allerdings gibt es da wahrscheinlich noch einen eleganteren Weg, direkt mit ElementTree.
the more they change the more they stay the same
deets

Code: Alles auswählen

from xml.etree.ElementTree import *
el = Element("foo")
el.attrib = {
    "oh-mein-gott" : "es geht",
    }

print tostring(el)
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Der dictionary-Ansatz von David und von deets funktioniert auch bei mir und scheint sich zu bewähren, vielen Dank!

Die lxml-Alternative von lunar werde ich mir auf jeden Fall einmal näher anschauen, aber das wird wohl etwas länger dauern. Auf den ersten Blick kommt es mir so vor, als ob ich da ebenfalls einen dictionary-Ansatz benutzen müsste (die Syntax will ja Python-kompatibel sein, und da können Attributnamen wie "from" wahrscheinlich nicht so leicht eingebaut werden). Aber ich kann mich ja irren.
Antworten