ElementTree (XML) speichert alles in eine Zeile?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das Problem ist nicht das `SubElement`, sondern `find`. Du kannst natuerlich im gesamten Baum nach einem passenden Vater suchen, aber dann durchsuchst du a) den gesamten Baum und b) hast du das Problem von mehreren Kandidaten.

Stellt sich die Frage, warum du die Funktionalitaet von ElementTree nochmal in einen unflexibleren Wrapper packen willst. Uebrigens, dein `prettify` Aufruf tut nichts.
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

kaineanung hat geschrieben:Auch wenn ich immer noch nicht ganz verstehe warum ich in der Klasse keine echten 'private'-Funktionen benutzen soll sondern die 'protected'. Das erste wird laut python-tutorial mit doppelten Unterstrichen deklariert und das Zweite, also die protected-Funktionen, nur mit einem Unterstrich.

private ist laut Tutorial definitiv privat und nicht überladbar in vererbten Klassen und protected eben nur 'semi-privat'. Man soll sie nicht ändern, man kann sie ändern in einer vererbten Klasse.

Nun gut, das ist ja wohl die Philosophie von OOP und dem Überladen und sicherlich ist es dem geschuldet daß ihr mir sagt die Funktionen sollen protected sein, richtig?
Nein, nicht richtig. Ich weiß nicht, welches Tutorial du verwendest, aber wenn da steht, dass in Python irgendwas protected wäre, ist es ein schlechtes Tutorial, weil das eben nicht stimmt.

Attributnamen mit einem führenden Unterstrich bedeuten: ist ein Implementierungsdetail und gehört nicht zur öffentlichen Schnittstelle. Die öffentliche Schnittstelle ist das, was man benutzen soll, aber nichts hindert einen daran, auch auf Implementierungsdetails zuzugreifen. Man tut das dann aber auf eigenes Risiko, denn manchmal funktioniert etwas nicht mehr, wenn man von außen an Implementierungsdetails rumfummelt. Außerdem können sich die Implementierungsdetails in der nächsten Version ohne Vorwarnung ändern, so dass dann Code, der darauf zugreift evtl. nicht mehr funktioniert.

Attributnamen mit zwei führenden Unterstrichen, die nicht mit zwei Unterstrichen enden, unterliegen dem sog. private name mangling. Das bedeutet, der tatsächliche Name wird umgebastelt, so dass der Klassenname mit hineingewurstelt wird. Dadurch können bei Mehrfachvererbung zwei Basisklassen Attribute mit denselben Namen haben ohne sich in die Quere zu kommen. Aber das Mangling ist genau definiert. Wenn ein Attribut __foo in einer Klasse Bar definiert ist, dann wird daraus der Name _Bar__foo, und den kann ich verwenden, denn in Python ist eben nichts privat:

Code: Alles auswählen

In [1]: class Bar:
   ...:     __foo = 1
   ...:     

In [2]: Bar._Bar__foo
Out[2]: 1

In [3]: Bar._Bar__foo = 2

In [4]: Bar._Bar__foo
Out[4]: 2
In specifications, Murphy's Law supersedes Ohm's.
kaineanung
User
Beiträge: 145
Registriert: Sonntag 5. April 2015, 20:57

@pillmuncher

Dank deiner detaillierten Ausführung habe ich es jetzt verstanden! Vielen Dank!

Ich habe es aus
https://www.hdm-stuttgart.de/~maucher/P ... assen.html
Unter Punkt 6.1.3. Sichtbarkeit:
private Attribute und Methoden sind von aussen nicht sichtbar. Attribute und Methoden werden als private deklariert, indem man ihren Namen mit dem Prefix __ (doppelter Unterstrich) versieht.
Das 'nicht sichtbar' habe ich wohl überlesen und auch nicht weiter verfolgt weil ich es ja doch benutzen konnte (bevor ich den Code verbessert habe hatte ich die Funktionen mit Doppelt-Unterstrich versehen).

@cofi
Ich werde bis morgen meine Klasse auflösen und ET direkt in meinem 'Haupt'-Code verwenden.
Dann hat sich wohl auch die Frage erledigt wie ich das Unter-Unter-Node finde weil ich dann da 'hinnavigieren' kann mit

Code: Alles auswählen

.find("Node').find("SubNode1").find("SubNode2")...
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@kaineanung: vergleich doch mal Dein add_node mit add_subnode! Beide machen fast das gleiche, nur das eine mit SubElement:

Code: Alles auswählen

    def add_node(self, nodename, value=""):
        ET.SubElement(self._root, nodename).text = value
Natürlich kann man find auch über mehrere Ebenen benutzen. Man sollte einfach mal die Dokumentation lesen. Aber das ist doch beim Erzeugen sowieso unnötig, weil da kennt man ja die Nodes.
Antworten