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.
ich habe zwei Funktionen zur Umwandlung einer kleinen XML-Datei in ein Dictionary (und umgekehrt) geschrieben. Leider habe ich ein kleines Problem mit der sauberen Kodierung/Dekodierung von UTF-8 zu darstellbarem String. Die erste XML-Datei ("sample-in.xml") habe ich mir dabei "von Hand" erstellt. Das Ergebnis wird vom Skript erstellt ("sample-out.xml"). Leider schaffe ich es nicht "sample-out.xml" wieder so ein zu lesen, dass alle Sonderzeichen richtig interpretiert werden. Vielleicht kann mir einer von euch ein Tipp geben?
Das encode hat da nichts verloren. XML sorgt selbst für seine binäre Repräsentation. Der XML Header ist deshalb verpflichtend, weil er entweder ein encoding anhubt, oder ohne UTF8 verwandt wird.
Mit minidom zu arbeiten ist übrigens nicht ratsam. Das ist uralt und schwierig zu handhaben. Nutze die mitgelieferte element-tree Implementierung. Ggf macht die auch dein Problem einfacher.
Das ist aber kaputt, denn der Code geht davon aus, dass die XML-Datei als UTF-8 kodiert ist. Das ist aber nicht garantiert. Genau dafür gibt es ja die XML-Deklaration, damit man in der Datei die tatsächliche Kodierung angeben kann. Das kodieren und dekodieren sollte man komplett der XML-Bibliothek überlassen. Die Kodierung ist Teil von der XML-Spezifikation, also fällt das auch in den Aufgabenbereich der Bibliothek und nicht in den eigenen Code, wo man leicht Fehler machen kann, oder Sachen nachprogrammiert, welche die Bibliothek bereits leistet.
Keine Ahnung was Minidom da macht, das verwende ich nicht, und wohl keiner der nicht auf Schmerzen steht oder Java toll findet. (Hohe Schnittmenge! )
Du solltest bessere Namen verwenden. Kein kryptischen Abkürzungen. Nicht `something_fn` wenn eigentlich `something_filename` gemeint ist. `fn` ist auch eine übliche Abkürzunge für „function“.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Hallo __blackjack__, anders habe ich das mit minidom nicht hinbekommen. Jetzt bin ich erstmal froh, dass es funktioniert.
@__deets__, ich bin jetzt echt beeindruckt. Hab den ersten Teil (xml2dict) mit ElementTree versucht und die Umwandlung zu einem dict() funktioniert auf anhieb
import xml.etree.ElementTree as ET
from pprint import pprint
tree = ET.parse("sample-in.xml")
root = tree.getroot()
xml_robo = {}
for child in root:
lang = child.attrib["lang"]
xml_robo[lang] = {}
for key_child in child:
key = key_child.attrib['name']
val = key_child.text
xml_robo[lang][key] = val
pprint(xml_robo)
#!/usr/bin/env python3
import xml.etree.ElementTree as ET
from pprint import pprint
def main():
robodoc_data = {
child.attrib["lang"]: {
key_child.attrib["name"]: key_child.text for key_child in child
}
for child in ET.parse("sample-in.xml").getroot()
}
pprint(robodoc_data)
if __name__ == "__main__":
main()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware