XML-Node initialisieren

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
unknown_member
User
Beiträge: 4
Registriert: Donnerstag 3. September 2009, 13:48

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!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
unknown_member
User
Beiträge: 4
Registriert: Donnerstag 3. September 2009, 13:48

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.
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.
unknown_member
User
Beiträge: 4
Registriert: Donnerstag 3. September 2009, 13:48

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?
unknown_member
User
Beiträge: 4
Registriert: Donnerstag 3. September 2009, 13:48

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
Antworten