Seite 1 von 1

Nonstandard-Attributnamen in xml.etree.ElementTree

Verfasst: Montag 27. Februar 2012, 18:22
von Goswin
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?

Re: Nonstandard-Attributnamen in xml.etree.ElementTree

Verfasst: Montag 27. Februar 2012, 18:27
von Dav1d
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.

Re: Nonstandard-Attributnamen in xml.etree.ElementTree

Verfasst: Montag 27. Februar 2012, 18:30
von deets

Code: Alles auswählen

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

print tostring(el)

Re: Nonstandard-Attributnamen in xml.etree.ElementTree

Verfasst: Montag 27. Februar 2012, 19:01
von lunar
@Goswin: Alternativ lxml...

Re: Nonstandard-Attributnamen in xml.etree.ElementTree

Verfasst: Montag 27. Februar 2012, 20:23
von Goswin
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.