etree - Subelement hinzufügen

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.
BlackJack

@kaineanung: Wenn Du nicht weisst an welchem Index Du etwas einfügen möchtest reicht Dir vielleicht die `append()`-Methode die das Element einfach als letztes Kindelement hinten anhängt.
kaineanung
User
Beiträge: 145
Registriert: Sonntag 5. April 2015, 20:57

@BlackJack

Wie ich weiß nicht wo ich es hinzufügen soll?
Doch doch. Nicht das wir aneinander vorbeireden: ich will den <a1>-Node (mitsamt seiner ganzen 'Unterbaum') an dem <a>-Node reinschieben. (siehe mein Besipiel oben)
Also ich weiß schon wohin ich das haben will, nur nicht welche Methode ich dafür benutzen kann.
Insert-Methode (vom etree-Objekt) erwartet als erstes Argument eben ein Index und da bin ich mir nicht sicher ob es die richtige Methode ist und wenn ja, wie ermittle ich den Index vom <a>-Node?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

<a1><a2>Mein Text</a2></a1>
`a2` ist das SubElement von `a1`, Klingelt da was?
Mit `append` kannst du das natuerlich auch machen, nur musst du es eben auf dem _richtigen_ Element, naemlich `a1` aufrufen.
kaineanung
User
Beiträge: 145
Registriert: Sonntag 5. April 2015, 20:57

@cofi

Das <a2> das SubElement von <a1> ist, das ist mir doch selbstverständlich klar.

Aber ich habe ja noch das <a>-Element in gleicher 'Ebene' mit dem <a1>.
Ich möchte jetzt das <a1>-Element IN DAS <a>-Element verschieben mitsam des <a2>-SubElements!

Code: Alles auswählen

<root>
<a></a>
<a1><a2></a2></a1>
<b></b>
</root>
Das <a>-Element ist in gleicher Ebene mit dem <a1>-Element. Das <a1>-Element hat noch ein SubElement, nämlich <a2>.
Ich möchte nun <a1><a2></a2></a1> IN DAS <a></a> verschieben.

Also will ich das aus dem genannten Beispiel folgendes wird:

Code: Alles auswählen

<root>
<a><a1><a2></a2></a1></a>
<b></b>
</root>
Wie mache ich das? Insert? Was anderes?

Vielleicht leigt es ja auch in der Darstellung das man es nicht erkennen kann?
Ich versuche es hiermit:
<a></a><a1><a2></a2></a1>
Soll werden zu :
<a><a1><a2></a2></a1></a>
Oder so verdeutlicht:

Code: Alles auswählen

 --a
|
 --a1
|  |
|   --a2
|
 --b
a1 soll verschoeben werden in a:

Code: Alles auswählen

 --a
|   |
|    --a1
|       |
|        --a2
|
 --b
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Oh, dass du du ein existierendes verschieben willst, statt ein neues einzufuegen.
Das ist aber auch das gleiche, nur muss man es halt noch loeschen:

Code: Alles auswählen

In [10]: tostring(top)
Out[10]: '<top><x><y /></x><z /></top>'

In [11]: z = top.find('z')

In [12]: top.remove(z)

In [13]: tostring(top)
Out[13]: '<top><x><y /></x></top>'

In [14]: top.find('x').find('y').append(z)

In [15]: tostring(top)
Out[15]: '<top><x><y><z /></y></x></top>'
kaineanung
User
Beiträge: 145
Registriert: Sonntag 5. April 2015, 20:57

@cofi

Achso, jetzt verstehe ich so langsam....

Ein Node ist ein Node und egal wieviele Subelemente er beinhaltet.
Ich finde das enstprechende Node, weise es einem temporären Node zu (bei dir das z) und 'appende' es an entsprechendes Node. Die subelemente des ausgewählten Nodes (nun in 'z' gespeichert' wandern natürlich automatisch mit!
Ah Ok, ich glaube ich habe es verstanden. Wird nachher gleich ausprobiert wenn ich zu Hause bin.

Aber jetzt bringst du mich auf was anderes:
Wieso benutze ich eigentlich die SubElement-Methode wenn ich ein Node erstellen und mit Find() das enstrepchende Node finden und daran anhängen kann?

Ich freue mich jedenfalls nachher heim zu kommen und gleich mal alles auszuprobieren ;) Danke euch!
Antworten