[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