Seite 1 von 1

XML-Node initialisieren

Verfasst: Donnerstag 3. September 2009, 13:52
von unknown_member
Hallo!

Ich habe ein XML-Dokument mit dem DOM eingelesen und habe so:

Code: Alles auswählen

print knotenname
den Knoten ausgegeben. Dabei kommt sowas raus:

Code: Alles auswählen

<DOM Element: Thema1 at 0x5d49350>
Wie kann ich mit dieser Information einen Knoten initialisieren?
Also etwa so:

Code: Alles auswählen

knotenname = initialize("<DOM Element: Thema1 at 0x5d49350>")
Danke!

Verfasst: Donnerstag 3. September 2009, 14:10
von Hyperion
Was genau willst Du denn erreichen? Soll das Zielmarkup so aussehen:

Code: Alles auswählen

<Thema1>
...
</Thema1>
?

Das entspräche ja genau dem Ursprung? Oder willst Du ganze Knoten (und Sub-Äste) kopieren?

Verfasst: Donnerstag 3. September 2009, 18:03
von unknown_member
Ja, genauso soll mein Ziel letztendlich aussehen. Es soll so eine Art Speichern sein.

Beim ersten Durchlauf wird also beispielsweise der Knoten "knotenname" geöffnet. Das, was bei meinem ersten Post beim "print"-Befehl rauskam (<DOM Element: Thema1 at 0x5d49350>) wird gespeichert.

Beim zweiten Durchlauf möchte ich dann wieder direkt bei diesem Knoten starten, also aus den gespeicherten Informationen auf den Knoten schließen und am Ende wieder "knotenname" vor mir sehen.

Verfasst: Donnerstag 3. September 2009, 18:17
von BlackJack
@unknown_member: Wenn Du später auf diesen Knoten zurückgreifen willst, musst Du Dir den Knoten merken und nicht die Zeichenkettenrepräsentation. Damit kann man nichts anfangen.

Falls zwischen den "Durchläufen" ein Programmneustart liegt, dann geht da so gar nicht. Dann musst Du Dir den Pfad zu dem Knoten merken und den Knoten damit später wieder ansteuern. Da würde ich aber dann auch nicht DOM nehmen, sondern eher `lxml`. Das kann XPath.

Verfasst: Freitag 4. September 2009, 09:27
von unknown_member
Aber ich könnte doch aus der Zeichenkette das "Thema 1" herausfiltern, dann in meinem XML-File nach Thema 1 suchen und alle Ergebnisse in eine List schreiben.
Aus dieser List wiederum könnte ich dann ja den Eintrag herausfiltern, der dieselbe Zeichenkettenrepräsentation besitzt.

Würde das funktionieren oder ändert sich die Repräsentation mit jedem Durchlauf?

Verfasst: Freitag 4. September 2009, 10:15
von unknown_member
Habe es jetzt mit folgender Routine geschafft, aus der Zeichenkettenrepräsentation einen Node zu holen:

Code: Alles auswählen

def getNodeFromString(string, dom):
	strings    = string.split(" ")
	res        = strings[2]
	nodes      = []
	for knotenName in dom.getElementsByTagName(res):
		nodes.append(knotenName)
	for i in range(len(nodes)):
		if nodes[i]==string:
			knotenName = nodes[i]
	return knotenName

Verfasst: Freitag 4. September 2009, 17:12
von Hyperion
unknown_member hat geschrieben:Habe es jetzt mit folgender Routine geschafft, aus der Zeichenkettenrepräsentation einen Node zu holen:

Code: Alles auswählen

def getNodeFromString(string, dom):
	strings    = string.split(" ")
	res        = strings[2]
	nodes      = []
	for knotenName in dom.getElementsByTagName(res):
		nodes.append(knotenName)
	for i in range(len(nodes)):
		if nodes[i]==string:
			knotenName = nodes[i]
	return knotenName
Hua.... ziemlich grausam, was Du da machst!

Zuerst noch mal zum Problem: Wieso merkst Du Dir nicht einfach sofort den Tagnamen? Element-Objekte haben das Attribut tagName. Das kannst Du Dir auch an der Stelle merken, an der Du Dir im Moment stattdessen den "normalen" Objekt-String merkst! Viel einfacher und Du sparst Dir das Fehler anfällige Parsing des Repräesentationsstrings.

Dann zum Snippet.

Zeilen 5-7 machen ziemlich sinnloses. Die Methode getElementsByTagName() liefert laut Doku ein iterierbares Objekt zurück, in dem alle gefundenen Knoten liegen. Ist so ziemlich dasselbe wie die Liste, die Du dort manuell erstellst.

Zeilen 8-10 lassen sich viel besser so schreiben:

Code: Alles auswählen

for node in nodes:
    if node.tagName == string
        special_node = node
Bitte beachte, dass es keine gute Idee ist string als Bezeichner zu nutzen. Denn string ist auch ein Modulname aus der Standard-Lib. So etwas sollte man aus vielen Gründen vermeiden.

Ich würde Deinen Code so umbauen:

Code: Alles auswählen

def getNodeFromString(node_name, dom):
    for node in dom.getElementsByTagName(res):
        if node.tagName==node_name:
            result_node = node
    return result_node
Allerdings kapiere ich nicht, was diese Funktion überhaupt bewirken soll! Du suchst einen Knoten mit einem bestimmten Tag-Namen innerhalb des Dokumentes oder eines Teils davon. Dann gibst Du den letzten Knoten aus diesem Abschnitt zurück, der dem Tag-Namen entspreicht. Was genau löst das?

Ich würde Dir raten evtl. doch noch einmal Dein gesamtes Problem zu schildern. Man kann aus dem Code durchaus erkennen, dass Du wohl eher Python Neuling bist. Daher kann es schon sein, dass man Dein Problem ganz anders und viel eleganter lösen kann :-)

Davon abgesehen empfehle ich Dir dringend das Tutorial durchzuarbeiten. Denn das direkte Iterieren über Sequenzen ist etwas sehr banales und grundlegendes ;-)