[Python-de] String Interpolation in ElementTree implementieren
Florian Lindner
mailinglists at xgm.de
Mo Sep 24 11:53:31 CEST 2012
Am Montag, 24. September 2012, 11:13:26 schrieb Achim Domma:
> Hi,
>
> aus welchem Grund auch immer wurde meine Antwort an die Liste verweigert.
> Hab' gerade keine Zeit und Lust mich darum zu kümmern, von daher hier
> nochmal privat. Evtl. hilft's ja:
>
>
> Hi,
>
> ist's eine Option, den Baum nachträglich zu modifizieren? Mit dem XPath
> Ausdruck "//text()|//@*" (aus dem Kopf) müßtest du alle Textknoten und
> Attribute bekommen. Da iterierst du drüber und ersetzt die Werte. Ist
> natürlich nicht ganz so effizient wie deine gewünschte Lösung, ergibt aber
> deutlich einfacheren, übersichtlicheren Code. Und du mußt wohl schon einen
> recht großes XML Dokument haben, damit der Unterschied relevant wird.
Hallo,
das ist leider recht schlecht zu realisieren bei mir.
Das XML-Dokument wird von oben nach unten von verschiedenen Modulen
abgearbeitet. Jedes Modul kann neue Werte hinzufügen oder Werte aus der
Ersetzungstabelle modifizieren.
Jedes Modul darf die Variablen-Ersetzungen also nur in seinem Bereich im XML-
Dokument durchführen. Wird es für das komplette Dokument durchgeführt, so
werden evtl. Ersetzungen vorgenommen werden, die später im Programmablauf
anders gemacht werden würden. Beispiel:
<root attrib={wurzel}>
<submodule> <- Kann wurzel modifizieren
Wurzel: {wurzel}
</submodule>
<nosubmodule> <- Ist nur ein normaler Child-Node
{wurzel}
</nosubmodule>
</root>
Am Anfang gilt wurzel="ganz oben". submodule könnte allerdings diesen Eintrag
ändern. Die Änderungen einfach auf eine Ebene zu beschränken, geht auch nicht,
da nicht jeder Child-Node einem Submodule entspricht.
Danke & Grüße,
Florian
> Grüße,
> Achim
>
> Am 24.09.2012 um 11:05 schrieb Florian Lindner:
> > Am Sonntag, 23. September 2012, 13:58:05 schrieb Diez B. Roggisch:
> >> Ich würde die einfach eine templating engine wie zb genshi empfehlen. Die
> >> kann das und kümmert sich um all die Details.
> >
> > Hallo,
> >
> > ich habe mir Genshi eben mal angeschaut und für meinen Anwendungszweck ist
> > das Overkill.
> >
> > Eine Möglichkeit in Python der ElementTree Klasse eine eigenes, von
> > Element
> > abgeleitete Klasse unterzuschieben gibt es nicht?
> >
> > Wie würde man sonst an das Problem rangehen: Ich will das Verhalten einer
> > Klasse modfizieren, die selten direkt instanziert wird, sondern idR von
> > Factory-Funktionen zurückgegben wird.
> >
> > Grüße,
> > Florian
> >
> >> Am 23.09.2012 um 12:23 schrieb Florian Lindner <mailinglists at xgm.de>:
> >>> Hallo,
> >>>
> >>> 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.
> >>>
> >>> Wie macht man sowas am geschicktesten?
> >
> > _______________________________________________
> > python-de maillist - python-de at python.org
> > http://mail.python.org/mailman/listinfo/python-de
Mehr Informationen über die Mailingliste python-de