Erst mal: Könntest du den Python-Code statt in Code-Tags in Python-Tags setzen? Sonst muss ich immer deine Beiträge hinterhereditieren
Rockstar hat geschrieben:Wenn ich das vorher in ne Variable auslager kann ich der dann nen Wert zuweisen?!?
Kannst du, musst du aber nicht. Ich habe es nur deswegen gemacht, damit das Programm lesbarer ist.
Rockstar hat geschrieben:Sind die irgendwie miteinander verküpft?
Variablen sind in Python (und Ruby und anderen Programmiersprachen) nur Namen für Objekte, so dass man auch auf das gleiche Objekt mit mehreren Namen zugreifen kann. Ein Beispiel:
Code: Alles auswählen
In [6]: a = set([1, 2, 3])
In [7]: b = a
In [8]: b.add(4)
In [9]: a
Out[9]: set([1, 2, 3, 4])
In [10]: id(a)
Out[10]: 1348442432
In [11]: id(b)
Out[11]: 1348442432
In [12]: a is b
Out[12]: True
Du siehst, dass man über b das Objekt verändert hat, welches auch als a bekannt ist, wenn man es sich genauer ansieht, stellt man fest, dass das Objekt welches an a und das an b sogar die gleiche ID besitzen, also das gleiche Objekt sind. Das mag vielleicht etwas komisch erscheinen, jedoch ist es oftmals praktisch, es wäre komisch wenn es sich anders verhalten würde.
Rockstar hat geschrieben:Allerdings gibts damit trotzdem Probleme.
Wenn ich deinen Code jetzt abänder das im zweiten Control-Block das zweite Tag geändert wird steht das wort test am ende nicht im Tag sondern ausserhalb.
Ja, das liegt daran, dass du die Struktur vom DOM nicht ganz verstehst (btw: ich auch nicht, aber dafür reicht es). Am besten demonstriere ich es dir an einem Bespiel:
Code: Alles auswählen
import xml.dom.minidom
aefile = 'domexample.xml'
outfile = 'domoutput.xml'
doc = xml.dom.minidom.parse(aefile)
controls = doc.getElementsByTagName('control')
print controls
print controls[1].childNodes
visiblenode = controls[1].childNodes[3]
print visiblenode
visible_textnode = visiblenode.childNodes[0]
print visible_textnode
visible_textnode.nodeValue = 'test'
f = file(outfile, 'w')
doc.writexml(f)
f.close()
Erstmal suche ich im DOM-Tree nach allen Control-Elementen. Dann bekomme ich die folgenden:
Code: Alles auswählen
[<DOM Element: control at 0xa962d8>, <DOM Element: control at 0xab50d0>, <DOM Element: control at 0xab5cb0>, <DOM Element: control at 0xabb8c8>]
Gut, du wolltest das zweite Element, also controls[1]. Dies hat folgende Nodes:
Code: Alles auswählen
[<DOM Text node "\n ">, <DOM Element: description at 0xab2148>, <DOM Text node " ">, <DOM Element: visible at 0xab21e8>, <DOM Text node "\n ">, <DOM Element: type at 0xab2288>, <DOM Text node " ...">, <DOM Element: execute at 0xab2328>, <DOM Text node "\n ">, <DOM Element: id at 0xab23c8>, <DOM Text node " ...">, <DOM Element: label at 0xab2468>, <DOM Text node "\n ">, <DOM Element: posX at 0xab2508>, <DOM Text node "\n ">, <DOM Element: posY at 0xab25a8>, <DOM Text node "\n ">, <DOM Element: width at 0xab2648>, <DOM Text node "\n ">, <DOM Element: height at 0xab26e8>, <DOM Text node "\n ">, <DOM Element: font at 0xab2788>, <DOM Text node "\n ">,
<DOM Element: onleft at 0xab2828>, <DOM Text node "\n ">, <DOM Element: onright at 0xab28c8>, <DOM Text node "\n ">, <DOM Element: onup at 0xab2968>, <DOM Text node "\n ">, <DOM Element: ondown at 0xab2a08>, <DOM Text node "\n ">, <DOM Element: align at 0xab2aa8>, <DOM Text node "\n ">, <DOM Element: textOffsetY at 0xab2b48>, <DOM Text node "\n ">, <DOM Element: textureNoFocus at 0xab2be8>, <DOM Text node "\n ">]
Wie du siehst ist hier das Element visible an 4. Stelle, also controls[1].childNodes[3].
Jedoch hat auch das Visible-tag noch einen childNode: den Text-Node visiblenode.childNodes[0]
Dieser Node hat einen Wert, nodeValue, der ist im Moment "no". Nun kannst du ihn auf "test" setzen und die XML-Datei generieren.
DOM ist eigentlich ganz einfach, wenn man weiß, welche Nodes welche childNodes haben, da brauchst du einfach nur ein wenig Übung.