Moin,
Gibt es irgendeine Möglichkeit beim Veröffentlichen die Seite automatisch testen zu lassen und eine Variable zurück zu bekommen ob alles valide ist oder nicht? Also ich dachte da irgendwie an so einen Dienst den ich noch nicht kenne, an den ich meine HTML Seite als String oder so sende und die mir dann antwortet true oder false je nach dem ob valide oder nicht?
Ja. Hier nochmal meine Anmerkungen aus dem Chat und in ausführlicher (für's Archiv):
Das ist üblicherweise kein Problem, man muß bloß erstmal unterscheiden ob man valides HTML oder XML haben möchte. Für HTML leistet der W3C-Validator ja bekanntlich gute Dienste. Und der macht auch nichts anderes als ein Programm dafür aufzurufen: onsgmls, wenn ich mich richtig erinnere. Früher hat er sogar mal die genauen Kommandozeilenparameter verraten, das scheint jetzt nicht mehr drin zu sein. Google offenbart: http://www.adp-gmbh.ch/misc/validating_html.html
XML ist ebenfalls einfach: Für XML gibt es das xmllint-Tool, das bei mir im Paket libxml2 enthalten war, und welches - wie der Name schon sagt - XML-Dateien überprüfen kann. Standardmäßig gibt xmllint Warnungen über das Dokument aus und sofern möglich eine korrigierte Version. Mit --noout unterdrückt man diese zweite Ausgabe. Ausserdem würde es versuchen DTDs ggbf. aus dem Netz zu ziehen, was neben der Verursachung von zusätzlichem Netzverkehr den unangenehmen Nebeneffekt hat dass sich die Sache länger hinzieht als nötig. Mit --nonet unterdrückt man das, hat aber ggbf. das Problem dass die Validierung ohne DTDs nicht wirklich viel Spaß macht. Ich hab dann halt eine lokale Kopie der DTD die ich benutze (XHTML 1.0 Strict) sowie der Entitydefinition die darin eingebunden sind und gebe xmllint mit dem Parameter --dtdvalid ... den URL zu meiner DTD-Kopie an (ausserdem ersetze ich noch den URL in der Doctype-Deklaration).
Insgesamt sieht das bei mir so aus: http://www.ploetzli.ch/blog/xmllint.phps. Die Konstante XMLLINT zeigt den Pfad zu xmllint (/usr/bin/xmllint) und DTDURL zeigt zu meiner DTD-Kopie (file:///home/hploetz/.../xhtml1-strict.dtd, und im gleichen Verzeichnis liegen auch xhtml-lat1.ent, xhtml-special.ent und xhtml-symbol.ent). Dann gibt es da eine Funktion xmllint die ein XHTML-Fragment (erster Parameter) wahlweise nur auf well-formedness prüft (dritter Parameter auf FALSE) oder gegen XHTML 1.0 Strict validiert (dritter Parameter auf TRUE), die dabei anfallenden Meldungen im zweiten Parameter speichert und ausserdem den Rückgabecode von xmllint (0 wenn alles glatt ging, sonst einen anderen) zurückgibt.
Weiter unten baut die Funktion das übergebene Textfragment in die Hülle ein die alle anderen Seiten auch haben um ein ordentliches Dokument draus zu machen, führt ggbf. die Ersetzung der DTD-URL aus und gibt das Resultat dann an xmllint.
Da diese Funktion über alle Inhalte drüberläuft bevor sie online gehen sollte eigentlich kein nicht valider Inhalt auftauchen, insbesondere nicht in Kommentaren (und vielleicht irgendwann mal Track/Pingbacks). Bei Kommentaren habe ich da noch eine weitere, vielleicht etwas übertriebene Sache: Kommentare werden zuerst auf well-formedness (dafür ist der Parameter da oben) geprüft. Dann weiss ich dass sie ordentliches XML sind und ich gehe mit einem Selbstbau-XML-Parser (http://www.ploetzli.ch/blog/sanitizer.phps) drüber der nur noch Elemente und Attribute übriglässt die ich für sicher halte (<style>body { display: none; }</style> gehört eher nicht dazu ;). Das Ergebnis geht dann nochmal durch die Validierung um sicher zu stellen dass zwischenzeitlich nichts schlimmes passiert ist.
Henryk Plötz
Grüße aus Berlin
~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~