Elementtree erstellt komplett unformatierte XML Dateien

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Mittwoch 12. September 2007, 14:15

Hallo zusammen,

ich habe mich gerade sehr gewundert als ich zum testen mal das Erzeugen eines XML-Files mit elementtree durchgespielt habe.

Code: Alles auswählen

In [1]: import xml.etree.ElementTree as ET

In [2]: root = ET.Element("Root")

In [3]: ET.SubElement(root, "SubElement", {"Val1":"A","Val2":"B"})
Out[3]: <Element SubElement at e4ef08>

In [4]: ET.ElementTree(root).write("test.xml")
raus kommt nachher nur das hier:

Code: Alles auswählen

<Root><SubElement Val1="A" Val2="B" /></Root>
Ohne irgendwelche Zeilenumbrüche und Einrückungen usw.
Die sind zwar für gänge tools völlig uninteressant aber um sich die ganze Sache in einem Editor anzugucken wäre das schon nicht schlecht.
Auch die Headereinträge aller version, und encoding fehlen.
Muss ich solche Sachen von Hand eintragen oder sollte ich beim Erstellen mit elementTree anders vorgehen ? Hab gesehen das es von einigen Leuten Methoden wie prettyprint gibt. Aber das sieht ehr nach Eigenbau aus.

Vielen dank schonmal
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Mittwoch 12. September 2007, 14:33

Hallo Zap!

Ich habe nicht viel Zeit. Deshalb hier nur der Code und der Link dazu:

Code: Alles auswählen

# in-place prettyprint formatter

def indent(elem, level=0):
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        for child in elem:
            indent(child, level+1)
        if not child.tail or not child.tail.strip():
            child.tail = i
        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
--> http://effbot.org/zone/element-lib.htm

mfg
Gerold
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Mittwoch 12. September 2007, 14:56

OK, danke, das ist das Ding was ich auch schon gefunden hatte..
Das funktioniert zwar auch, finde das allerdings etwas merkwürdig das ich sowas tatsächlich brauche. Nun gut.
Was ist denn mit dem "Header" den ich ebenfalls angesprochen hatte.
Beispiel: '<?xml version="1.0" encoding="utf-8"?>'
Irgendwie finde ich die Abfrage in der write Funktion etwas seltsam,
warum wird defaultmäßig kein header geschrieben?

Code: Alles auswählen

In [26]: ET.ElementTree.write??
Type:           instancemethod
Base Class:     <type 'instancemethod'>
String Form:    <unbound method ElementTree.write>
Namespace:      Interactive
File:           c:\python25\lib\xml\etree\elementtree.py
Definition:     ET.ElementTree.write(self, file, encoding='us-ascii')
Source:
    def write(self, file, encoding="us-ascii"):
        assert self._root is not None
        if not hasattr(file, "write"):
            file = open(file, "wb")
        if not encoding:
            encoding = "us-ascii"
        elif encoding != "utf-8" and encoding != "us-ascii":
            file.write("<?xml version='1.0' encoding='%s'?>\n" % encoding)
        self._write(file, self._root, encoding, {})
BlackJack

Mittwoch 12. September 2007, 19:16

Weil der default-mässig nicht gebraucht wird. Nur wenn es eine andere XML-Version oder eine andere Kodierung als ASCII oder UTF-8 sein soll, braucht man diese Zeile.

Und "Pretty-Printing" kann man eigentlich ohne ein Schema gar nicht machen, da man sonst gar nicht weiss wo man "whitespace" zur Formatierung einfügen darf oder wo das nicht erlaubt ist.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 12. September 2007, 20:27

BlackJack hat geschrieben:Und "Pretty-Printing" kann man eigentlich ohne ein Schema gar nicht machen, da man sonst gar nicht weiss wo man "whitespace" zur Formatierung einfügen darf oder wo das nicht erlaubt ist.
Das ist auch das Problem, warum XML niemals human readable sein wird. In ODF wird afair sogar der Zeilenumbruch direkt übernommen, jede Art von Whitespace auch.

Zap: Was anderes darf elementree ohne DTD auch gar nicht tun. Sonst hast du plötzlich überall firstChild TextNodes rumlungern die nur aus Whitespace bestehen.
TUFKAB – the user formerly known as blackbird
Antworten