[Python-de] String Interpolation in ElementTree implementieren

Walter Dörwald walter at livinglogic.de
Di Sep 25 12:35:57 CEST 2012


On 25.09.12 07:30, Stefan Behnel wrote:

> Florian Lindner, 23.09.2012 12:23:
>> ich will erreichen, dass man in XML Ersetzungen einbetten kann, also:
>>
>> <root filesystem="{filesystem}">
>> {files}
>> </root>
>>
>> ich habe ein Dictionary repl = {"filesystem" : "btrfs", "files" : "whatever"}
>> und würde das beim parsen des XML einfach mitgeben und bekomme dann die
>> Strings schon fertig eingesetzt zurück. Ersetzt werden sollen Attribute und
>> Text.
>>
>> Hier fängt das Problem an. Als XML-API benutze ich ElementTree.
>>
>> Das einfachste wäre wohl, wenn der ElementTree benutzende Code sich selber
>> drum kümmert:  str = interpolate(node.attrib["filesystem"], repl). Oder halt
>> einfach direkt .format aufruft.
>>
>> Mir wäre es aber am liebsten, wenn ich das weitgehend transparent einbinden
>> könnte. Wenn ich nun von xml.etree.ElementTree.ElementTree ableite und die
>> Methoden text und attrib überschreibe, ok... Nur müsste ich wohl auch
>> sämtliche Funktionen modifizieren, die ElementTrees zurückgeben (damit sie
>> meine Kindklasse zurückgeben) und das wäre dann wohl doch recht viel Aufwand.
>
> Da möchte ich von abraten. Mach deine Ersetzung explizit durch einen
> Funktionsaufruf.
>
>> Wie macht man sowas am geschicktesten?
>
> Mach das ganz am Ende der Verarbeitung, direkt vor dem Rausschreiben.
> Iterier über alle Elemente und mach dabei deine Ersetzungen, auch im
> "attrib" dict. Das sind nur ein paar Zeilen Code und du bist vollständig
> unabhängig davon, welche ET-Implementierung benutzt wird (ET, cET, lxml)
> oder wie sich diese Implementierung intern weiter entwickelt.

Alternativ kannst Du das natürlich dann machen, *nachdem* Du aus dem 
ElementTree einen XML-String erzeugt hast.

Servus,
    Walter



Mehr Informationen über die Mailingliste python-de