Seite 1 von 1

PrettyXML: Schönerer Code geparst mit Expat

Verfasst: Mittwoch 26. August 2009, 17:07
von snafu
Moinsen,

hier die erste Version meines PrettyPrinters für wohlgeformten XML/HTML-Code. Ja, sowas gibt es bereits, aber das macht ja nichts. :)

Code: Alles auswählen

In [1]: from prettyxml import prettify

In [2]: code = '<html><head><title>Hello, World!</title></head><body><p id="greet" name="world">Hello, <strong>World</strong>!</p></body></html>'

In [3]: print prettify(code)
------> print(prettify(code))
<html>
  <head>
    <title>Hello, World!</title>
  </head>
  <body>
    <p id="greet" name="world">Hello, <strong>World</strong>!</p>
  </body>
</html>
Ist bisher noch nicht so intensiv getestet und soll auch erstmal ein Anfang sein. Kriterien: Grundsätzlich wird für ein neues Element eine neue Zeile begonnen und die Einrückungsstufe erhöht. Die Einrückung selbst wird durch Anzahl der Leerzeichen mitgegeben, Standardwert ist 2. Wenn sich Text innerhalb des Elements befindet, wird so lange in der selben Zeile geschrieben, bis die Anzahl der Start-Tags durch die Anzahl der End-Tags ausgeglichen wurde. Eine Überprüfung auf Namensgleichheit der Tags findet (noch) nicht statt.

Den Code gibt's hier. Optimierungsvorschläge sind natürlich immer willkommen. :)

Verfasst: Mittwoch 26. August 2009, 17:18
von cofi
Gehe ich recht in der Annahme, dass "wohlgeformt" hier "schoen aussehend" heisst?
In der XML-Welt steht "well-formed" allerdings fuer gueltiges XML.

Verfasst: Mittwoch 26. August 2009, 17:41
von snafu
Ich meinte eigentlich auch gültig. Bei ungültigen Eingaben sollte sich Expat ja beschweren.

Verfasst: Mittwoch 26. August 2009, 21:25
von sma
Ich möchte noch klugscheißen und anmerken, dass das Umformatieren von XML natürlich das Dokument ändert, denn jeder Text, auch Leerzeichen, Teil des Dokuments sind. Für XHTML mag das egal sein, doch für XML an sich kann das über Sieg oder Niederlage entscheiden - insbesondere, wenn eine kanonische Form verlangt ist oder eine Signatur gemäß XML DSIG vorhanden ist.

Bei einem Blick auf den Quelltext würde ich sagen, dass " in Attributwerten oder < und & im Text nicht korrekt formatiert wird. Diese drei Zeichen müssen laut XML-Spec ja als Entities dargestellt werden.

Stefan