So, ich glaube jetzt habe ich es richtig.
Um beim 'umtippen' wurde es mir auch immer klarer was ihr so meint.
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?
Nun gut, hier die Klasse:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import xml.etree.ElementTree as ET
def prettify(elem, indent=" ", level=0):
i = "\n" + level*indent
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + indent
for el in elem:
prettify(el, indent, level+1)
if not el.tail or not el.tail.strip():
el.tail = i
if not elem.tail or not elem.tail.strip():
elem.tail = i
class MyXML(object):
def __init__(self, rootname):
self._root = ET.Element(rootname)
def add_node(self, nodename, value=""):
tmp_node = ET.Element(nodename)
self._root.append(tmp_node)
if value != '': tmp_node.text = value
def add_subnode(self, subnodename, new_nodename, value=""):
parent_node = self._root.find(subnodename)
tmp_node = ET.SubElement(parent_node, new_nodename)
if value != '': tmp_node.text = value
def move_node(self, node_name_to_move, node_name_target):
tmp_node_name_target = self._root.find(node_name_target)
tmp_node_to_move = self._root.find(node_name_to_move)
self._root.remove(tmp_node_to_move)
tmp_node_name_target.append(tmp_node_to_move)
def write(self, xmlFileName):
prettify(self._root)
ET.ElementTree(self._root).write(xmlFileName,encoding="utf-8")
Ach ja, der Name ist MyXML geblieben. Ist ja meine 'Abstraktion' von etree für XML und da ist mir nichts besseres eingefallen.
ein Node zu verschieben ist nun auch enthalten.
Auch habe ich nun verstanden wie das mit dem Tree und dem Node geht. Node hat erstmal nichts mit dem Tree zu tun sondern ist als ein Element, unabhängig von der eigentlichen XML-Struktur zu betrachten. Auch wenn es weitere Unterelemente beinhalten würde.
Wenn man das Node nun soweit manipuliert und modelliert hat, weist man es dem Tree zu und knüpft es sozusagen in den Baum ein. Um ein vorhandenes Node zu bearbeiten kann man es im Baum finden und auf ein (temporäres) Nodeobjekt referenzieren. Dort bearbeiten (z.B. set(Value) und der Gleichen) und es wird, dank der Referenzierung, in der Baumstruktur geändert.
Das Einzige was ich nicht verstanden habe:
wenn ich ein bestehendes Node (im root) einem temporären Node-Objekt zuweise (sagen wir mal tmpNode) und das wird ja als Referenz gemacht weil sonst ein tmpNode.set(value) den Wert im root (von welchem ich es ja referenziert habe) nicht verändern würde, es dann im root aber lösche (root.remove(tmpNode)), wieso bleibt der ganze Node erhalten in der temporären Node-Referenz und kann es dann woanders (sagen wir einem targetNode welches im root enthalten ist) wieder hinzufügen (targetNode.append(tmpNode))?
Will damit sagen: wenn es eine Referenz ist (ein Pointer) auf das Element, ich das Element aber lösche, dann zeigt der Pointer ja auf nichts mehr? Ich füge diesen aber an anderer Stelle ja trotzdem wieder ein?
Aber erstmal: es funktioniert und es hat mich einen guten Schritt weiter nach vorne gebracht!
Danke euch allen für eure Geduld und Hilfe!
