ich versuche mich gerade an xml und habe ein Beispiel aus den Python-Buch von Opengalileo genommen.
Generell verstanden habe ich, was das Programm macht.
Das einlesen von xml Datei klappt auch super. Allerdings wenn ich xml Dateien schreiben will, bekomme ich eine sehr "komische" Fehlermeldung.
Ich habe das Orakel Google bereits befragt, aber bin aus den Antworten da nicht so ganz schlau geworden.
Hier die Fehlermeldung:
Wie gesagt, mit der letzten Zeile:Traceback (most recent call last):
File "...XMLGenerator/src/XMLGenerator.py", line 62, in <module>
schreibe_dict(eintraege,"ausgabe.xml")
File "...XMLGenerator/src/XMLGenerator.py", line 53, in schreibe_dict
tag_dict.appendChild(tag_eintrag)
File "/usr/lib/python2.6/xml/dom/minidom.py", line 121, in appendChild
_clear_id_cache(self)
File "/usr/lib/python2.6/xml/dom/minidom.py", line 1471, in _clear_id_cache
node.ownerDocument._id_cache.clear()
AttributeError: 'NoneType' object has no attribute '_id_cache'
kann ich garnichts anfangen.AttributeError: 'NoneType' object has no attribute '_id_cache'
Hauptsächlich meckert er über die Zeile:
Code: Alles auswählen
tag_dict.appendChild(tag_eintrag)
Anbei noch der Code:
Code: Alles auswählen
import xml.dom.minidom as dom
def _knoten_auslesen(knoten):
return eval("%s('%s')" % (knoten.getAttribute("typ"),
knoten.firstChild.data.strip()))
def lade_dict(dateiname):
d = {}
baum = dom.parse(dateiname)
for eintrag in baum.firstChild.childNodes:
if eintrag.nodeName == "question":
schluessel = wert = None
for knoten in eintrag.childNodes:
if knoten.nodeName == "string":
schluessel = _knoten_auslesen(knoten)
elif knoten.nodeName == "query":
wert = _knoten_auslesen(knoten)
d[schluessel] = wert
return d
def _erstelle_eintrag(schluessel, wert):
tag_eintrag = dom.Element("question")
tag_schluessel = dom.Element("string")
tag_wert = dom.Element("query")
tag_schluessel.setAttribute("typ", type(schluessel).__name__)
tag_wert.setAttribute("typ", type(wert).__name__)
#hier muss ich dann die SPARQL Querie an den Server schicken und die Antworten hinzufuegen.
text = dom.Text()
text.data = str(schluessel)
tag_schluessel.appendChild(text)
text = dom.Text()
text.data = str(wert)
tag_wert.appendChild(text)
tag_eintrag.appendChild(tag_schluessel)
tag_eintrag.appendChild(tag_wert)
return tag_eintrag
def schreibe_dict(d, dateiname):
baum = dom.Document()
tag_dict = dom.Element("musicbrainz-dataset")
baum.appendChild(tag_dict)
for schluessel, wert in d.iteritems():
tag_eintrag = _erstelle_eintrag(schluessel, wert)
tag_dict.appendChild(tag_eintrag)
#tag_dict.appendChild(self,tag_eintrag)
f = open(dateiname, "w")
baum.writexml(f, "", "\t", "\n")
f.close()
eintraege=lade_dict("test.xml")
schreibe_dict(eintraege,"ausgabe.xml")
Danke!