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.
from xml.dom.minidom import Document
import xml.dom.minidom as minidom
import codecs
#create minidom-document
doc = Document()
# create base element
base = doc.createElement('Dictionary')
doc.appendChild(base)
# create an entry element
entry = doc.createElement('Entry')
# ... and append it to the base element
base.appendChild(entry)
# create another element
german = doc.createElement('German')
# create content
german_content = doc.createTextNode('Hund')
# append content to element
german.appendChild(german_content)
# append the german entry to our entry element
entry.appendChild(german)
# now the same with an english entry
english = doc.createElement('English')
english_content = doc.createTextNode('dog')
english.appendChild(english_content)
entry.appendChild(english)
with codecs.open("C:/Users/Emel/Desktop/out.xml", "w", "utf-8") as out:
doc.writexml(out)
und möchte die XML datei aber mit einer schönen Formatierung erstellen. Gibt es da eine möglichkeit?
from xml.etree import ElementTree as et
def indent(elem, level=0):
i = "\n" + level*" "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
base = et.Element('Dictionary')
entry = et.SubElement(base, 'Entry')
et.SubElement(entry, 'German').text = 'Hund'
et.SubElement(entry, 'English').text = 'dog'
indent(base)
doc = et.ElementTree(base)
with open("C:/Users/Emel/Desktop/out.xml", "w") as out:
doc.write(out)
Oder `lxml`, da gibt es das schon eingebaut, plus einigen anderen nützlichen Sachen. Wie man sich freiwillig mit einer DOM-API rumschlagen kann ist mir ein Rätsel.
@kl.feigling89: gar nicht! Es ist genauso eine schlechte Idee, wie Variablennamen durchzunummerieren. Die Reihenfolge der <entry>-Tags ist durch die Reihenfolge, wie sie in der xml-Datei stehen schon genügend geordnet. Was wäre der Sinn dahinter, nochmals eine zweite Ordnung, die der ersten vielleicht sogar widerspricht, einzuführen?
Natuerlich geht das, aber das ist kein sinnvolles XML-Format. Wenn du tatsaechlich irgendwo IDs vergeben willst, dann als _Attribut_ aber nicht als _Tag_.
Das funktioniert dann analog zum "lang" Attribut .. nur eben bei `E.entry`
Ohh, da habt ihr recht. Habe Xml noch nie benutzt und hab nicht darüber nachgedacht, dass die Reihenfolge konstant ist.
Jetzt hab ich noch eine kleine Frage und hoffe es ist die letzte. Wie speichere ich denn am besten Array oder Listen ab ?
Wandele ich es als String? oder gibts noch ne alternative?
@kl.feigling89: Was für ein Array? Und reden wir immer noch von XML? Die Python-Datentypen einfach mit `str()` umwandeln ist zum Speichern keine gute Idee, denn dann stellt sich ja die Frage wie man das wieder einliest, und die Antwort darauf ist entweder hässlich und unsicher oder halt auf Python beschränkt. Wenn Du das in XML speichern willst, dann kannst Du ja einfach ein Element für den Container erstellen und darin dann Elemente für jeden Wert, also ``['one', 'two', 'three']`` könnte man als