Re: [Python-de] String Interpolation in ElementTree implementieren
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@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@python.org http://mail.python.org/mailman/listinfo/python-de
participants (1)
-
Florian Lindner