Referenz auf Teile von XML tree

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.
Antworten
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Hallo,

ich möchte Teile eines XML-Baums als Referenz weiter bearbeiten. Wenn ich den Baum allerdings wie eine Liste behandle wird daraus leider auch eine Liste (vgl. Beispiel).

Code: Alles auswählen

from lxml import etree
rawtext=""" <root>
                <t1></t1>
                <t2></t2>
                <t3></t3>
            </root>"""
tree = etree.fromstring(rawtext)
print(type(tree))
new_tree=tree[1:]
print(type(new_tree))
Ausgabe

Code: Alles auswählen

<type 'lxml.etree._Element'>
<type 'list'>
An der Liste kann ich mit lxml Änderungen vornehmen als ob es noch ein xml tree wäre, die Änderungen erscheinen aber nicht im tree und ich habe folglich Probleme das Ergebnis zu speichern. Weiß jemand wie man die Listenoperationen so Anwendet, dass man die Teile des Baums wirklich nur referenziert und keine Liste als Kopie erstellt?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das Problem ist nicht die Liste, sondern das Slicing von etree.

Die beste Loesung ist, dass du auf dem tree arbeitest - dh XPath oder CSS-Selektoren, so bist du auch nicht an die Elementreihenfolge gebunden.
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Hallo cofi,

danke für den Hinweis! Ich dachte nur das müsste doch auch einfacher gehen als mit XPath, gerade weil das slicen sogar explizit im lxml Tutorial (http://codespeak.net/lxml/tutorial.html) als Feature erwähnt ist (Abschnitt "Elements are lists").
lunar

@psyalex: Das Tutorial beschreibt, dass Elemente sich bei bestimmten Operationen (u.a. Slicing) wie Listen verhalten. Ich denke, Du weißt, was Listen beim Slicing zurückgeben. Anders gesagt: Wenn Du Listenoperationen auf Elemente anwendest, sollte es Dich nicht wundern, wenn dann auch das Ergebnis einer Listenoperationen herauskommt ;)

Außerdem: Was außer einer Listen von Elementen könnte Slicing den sinnvollerweise zurückgeben?
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

@lunar was ich gehofft hatte war durch das Slicing eine Referenz auf einen Teil des XML Baumes zu bekommen. Ich würde dann gerne dieser Referenz Elemente hinzufügen, die dann entsprechend ja auch im Baum erscheinen müssten. Die Liste, die ich bekomme, scheint aber nur eine Liste mit Referenzen auf die Elemente im Baum zu sein. Das Hinzufügen in der Liste führt nämlich nicht dazu, dass die Elemente auch im Baum auftauchen. Wahrscheinlich hab ich da aber einen Denkfehler, wenn man komplexer sliecet ist ja u.U. gar nicht mehr klar wo das Element dann im Baum auftauchen müsste.
lunar

So etwas wie den "Teil eines XML-Baums" gibt es nicht. Ein gültiger XML-Baum hat immer ein einziges Wurzelelement. Es kann keinen XML-Baum mit mehreren Wurzelelementen geben. Damit man also durch Slicing einen Baum erzeugen könnte, müsste es den Wurzelknoten implizit kopieren. In diesem Fall hätte man trotz Slicing also in jedem Fall wieder ein einzelnes Element, was der der Intuition des Listen-Protokolls aber widerspräche. Bei Listen erzeugt Slicing immer eine Kopie dieses Abschnitts der Liste.
Antworten