Forum: PC-Programmierung Python: xml appendChild in for-Schleife


von Mark M. (mom-jovi)


Lesenswert?

Folgendes Problem mit Python 2.3:
Ich editiere eine XML-Datei mit dem Modul xml.dom.minidom .
In der untenstehenden Funktion soll einem Knoten "Device" eine 
StartUp-Liste angefügt werden. Die Liste wird mittels der Funktion 
"getStartUpList(nodeDevice)" aus einer externen Quelle gelesen, wobei 
das Argument "nodeDevice" dem Finden der richtigen Liste dient. Der 
Rückgabewert ist ein Element-Knoten, der alle Einträge der Liste als 
Kinder hat. Die Kinder der Liste sollen nun unter Device:CoE eingefügt 
werden, deshalb wird "nodeCoE" bestimmt.
Bis hierhin funktioniert alles!

Nun will ich mit einer for-Schleife sämtliche Kinder von nodeStartUpList 
an CoE anhängen.
Hier erlebe ich eine Überraschung:
(1) Die prints geben mir nur Text-Knoten aus und in nodeCoE stehen 
danach auch nur Text-Knoten (Leerzeichen und Newlines). SO SOLLTE ES 
NICHT SEIN!
(2) Sobald ich appendChild nicht mehr verwende, geben mir die prints 
ALLE Element-Knoten von nodeStartUpList aus. SO SOLLTE ES SEIN!!!

Hilfe, ich komme hier nicht weiter! Was mache ich falsch?
1
import xml.dom.minidom as dom
2
3
def setStartUpList(nodeDevice):
4
    nodeStartUpList = getStartUpList(nodeDevice)
5
    nodeCoE = nodeDevice.getElementsByTagName('CoE')[0]
6
    # (1)
7
    for each in nodeStartUpList.childNodes:
8
        print each
9
        nodeCoE.appendChild(each)
10
        print 'appended %s'%each
11
    # (2)
12
    for each in nodeStartUpList.childNodes:
13
        print each

von Rolf Magnus (Gast)


Lesenswert?

Vielleicht hängt es damit zusammen, daß du aus einer Liste Elemente 
löschst, während du über diese iterierst.

von Mark M. (mom-jovi)


Lesenswert?

In die Richtung hab ich auch schon gedacht.
Aber in der for-Schleife kann das nicht passieren, sonst würden bei (2) 
nicht alle Elemente ausgegeben. Dann bleibt nur noch appendChild in (1), 
aber damit mach ich das auch an anderer Stelle - mit Erfolg.

Ich beobachte übrigens folgendes:
In (1) werden nur Text-Knoten ausgegeben, obwohl die Liste auch aus 
Element-Knoten besteht.*)
Anschließend, in (2), werden nur die Element-Knoten ausgegeben, die 
Textknoten aus (1) sind alle weg.
Aber warum??? Ich versteh es nicht, was soll ich da noch debuggen...

(2) habe ich übrigens nur zur Überprüfung angefügt. Das Ziel ist, (1) 
zum Laufen zu bekommen!

*)
Zum Verständnis für die, die mit xml.dom.minidom nicht so vertraut sind:
Das Modul liest eine XML-Datei als Liste aus Knoten ein. Da gibt es dann 
zum einen die üblichen Element-Knoten, wie man sie von XML kennt, z. B. 
<Tag>text</Tag> - und Text-Knoten. Text-Knoten sind reiner Text, also z. 
B. der Inhalt des genannten Tags ("text"), aber auch Ketten aus Newlines 
und Tabs zur Formatierung/Einrückung des XML.

von Mark M. (mom-jovi)


Lesenswert?

Ok, des Rätsels Lösung ist gefunden...
nodeStartUpList und nodeCoE stammen von verschiedenen Document-Typen. Da 
Python mit Referenzen und nicht mir Kopien arbeitet, ist es dann ein 
Problem, einen Knoten aus dem einen Document dem anderen anzufügen.
Man muss den Knoten also zuerst kopieren, was ich bei (1a) mit cloneNode 
mache. Das Argument 1 setzt den Parameter "deep", sodass auch die 
Kindeskinder kopiert werden!
1
import xml.dom.minidom as dom
2
3
def setStartUpList(nodeDevice):
4
    nodeStartUpList = getStartUpList(nodeDevice)
5
    nodeCoE = nodeDevice.getElementsByTagName('CoE')[0]
6
    # (1)
7
    for each in nodeStartUpList.childNodes:
8
        print each
9
        # (1a)
10
        eachCopy = each.cloneNode(1)
11
        nodeCoE.appendChild(each)
12
        print 'appended %s'%each
13
    # (2)
14
    for each in nodeStartUpList.childNodes:
15
        print each

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.