Seite 1 von 1
XML-Darstellung
Verfasst: Donnerstag 11. Juli 2013, 02:05
von MarcelF6
Hallo zusammen
Ich habe eine XML-File als Ausgabedatei, das alle Tags aneinanderreiht. Gibt es eine Möglichkeit, eine schöne Darstellung zu erhalten?
Ich habe es mit pretty_print von etree probiert, leider führte das aber nicht zu dem Gewünschten.
Danke für die Hilfe.
Re: XML-Darstellung
Verfasst: Donnerstag 11. Juli 2013, 06:56
von noisefloor
Hallo,
definiere mal "schön"
Was würdest du denn gerne sehen? Und wohin erfolgt die Ausgabe? Terminal oder soll in eine GUI?
Gruß, noisefloor
Re: XML-Darstellung
Verfasst: Donnerstag 11. Juli 2013, 07:30
von BlackJack
@MarcelF6: Könntest Du das mal etwas ausführlicher beschreiben? Von welchem `etree` reden wir? Weder `xml.etree` noch `lxml.etree` kennen eine Funktion mit dem Namen `pretty_print()`. `lxml.etree.dump()` kennt ein Argument mit dem Namen — und das ist per Default `True`. Die `ElementTree`-Objekte haben eine `write()`-Methode und bei `lxml` kennen die ein `pretty_print`-Argument. Wenn man dort `True` übergibt (Default ist `False`), dann sollte eigentlich das passieren was Du wahrscheinlich haben möchtest. Warum tut es das nicht? Zeig doch mal ein minimales, lauffähiges Beispiel von dem Problem.
Re: XML-Darstellung
Verfasst: Donnerstag 11. Juli 2013, 12:03
von Boa
Wenn das nicht automatisch passieren muss, ist eine einfache Möglichkeit das Dokument in Notepad++ zu öffnen:
TextFX->HTML Tidy->clean Document wrap
Die Optionen was genau dabei passieren soll müssten sich auch anpassen lassen. Ich nehme an, dafür gibt es eine Konfigurationsdatei.
Ansonsten guck dir Mal tidylib an. Vermutlich kann BeautifulSoup sowas auch. Das wäre eine alternative, falls der Input nicht ganz standardkonform ist.
Re: XML-Darstellung
Verfasst: Donnerstag 11. Juli 2013, 12:12
von BlackJack
@Boa: Es geht hier um *XML*. Nicht standardkonformes XML gibt es nicht, weil es dann kein XML mehr ist, und sich jedes XML verarbeitende Programm weigern wird damit zu arbeiten. Weshalb ich auch davon abraten würde XML mit HTML-Werkzeugen zu bearbeiten, denn nicht jedes gültige HTML ist auch gültiges XML.
Ein externes Werkzeug zum „pretty printing” wäre zum Beispiel ``xmlstarlet``.
Re: XML-Darstellung
Verfasst: Donnerstag 11. Juli 2013, 12:34
von Boa
@BlackJack: HTML ist überhaupt kein XML. Meine Varianten können soweit ich weiß mit XML umgehen, sonst hätte ich sie nicht vorgeschlagen. HTML tidy und BeautifulSoup sind auch jeweils XML Parser. Und wenn es um die Validität der Dokumente geht, kann man diese im Vorhinein prüfen. Erfahrungsgemäß trifft man im Web auf viele nicht standardkonforme XML Dokumente. Von mir aus kann man sie auch Text Dokumente mit dem ungerechtfertigten Anspruch auf XML Validität nennen. Das ist zwar genau aber umständlich. BeautifulSoup ist bei der Verarbeitung solcher Dokumente sehr praktisch. Wenn man die Dokumente selbst erstellt, ist es sicher ratsam sie auf Validität zu prüfen, um das Ergebnis nicht zu verfälschen.
Re: XML-Darstellung
Verfasst: Donnerstag 11. Juli 2013, 12:42
von BlackJack
@Boa: Die Erfahrung kann ich nicht teilen. Insbesondere weil man mit solchen Dokumenten nichts anfangen kann, weil jeder XML-Parser damit die Arbeit verweigert.
Re: XML-Darstellung
Verfasst: Freitag 12. Juli 2013, 09:45
von Boa
@BlackJack: Ok, das "Erfahrungsgemäß" ist eine Floskel. Also genauer; Es gibt Web Entwickler, die XHTML besonders toll finden, weil es etwas neues ist und dann versuchen darin wie in HTML Webseiten zu schreiben, ohne diese zu validieren. Ich habe an einer Drupal Webseite gearbeitet (ein Content Management System), bei dem gegen Ende die Seiten durch den W3C Validator geschickt wurden. Es war ein ziemlicher Aufwand die Seite valide zu bekommen, weil die Autoren einzelner Module sich nicht um die Validität der gelieferten XHTML Inhalte gekümmert hatten. BeautifulSoup arbeitet auch mit invalidem XML, verweigert also nicht die Arbeit:
Code: Alles auswählen
from BeatifulSoup import BeautifulSoup
input = '''<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<title>Text</title>
<head>
<body>
<h1>Text</h1> <br>
</body>
</html>'''
soup = BeautifulSoup(input)
soup.prettify()
tidy sollte auch damit klarkommen.
[EDIT] Ich habe gerade Mal nachgesehen und unsere Seite ist tatsächlich noch valide. Im gegensatz zu Drupalcenter.de
http://validator.w3.org/check?uri=http% ... ne&group=0
War vielleicht nicht die beste Idee die "strict" Version zu deklarieren ^^
Re: XML-Darstellung
Verfasst: Freitag 12. Juli 2013, 10:58
von BlackJack
@Boa: Aber wenn das als XHTML ausgeliefert wird, ohne gültiges XML zu sein, dann zeigt doch der Browser eine Fehlermeldung statt der Seite an. Zumindest alle Browser die ich hier installiert habe tun das. Es ist also nicht so einfach kaputtes X(HT)ML auszuliefern ohne dass das massiv auffällt.
Ob BeautifulSoup an dieser Stelle explizit mit ungültigem XML arbeitet wage ich auch zu bezweifeln. Da wird sehr wahrscheinlich einfach der selbe Parser verwendet, der auch für potentiell kaputtes HTML verwendet wird, denn kaputtes XHTML kann man ja problemlos als kaputtes HTML behandeln.
Die Frage ist ob BeautifulSoup garantiert, dass am Ende XML heraus kommt. Denn in HTML dürfen ja durchaus Tags vorkommen die nicht explizit geschlossen werden müssen. Das in Deinem Beispiel aus dem '<br>' zum Beispiel ein '<br />' wird, ist bei HTML nicht zwingend erforderlich.