Sprawdziłem dziś http://pinkaccordions.homelinux.org/wblog
za pomocą
xmllinta
i ponieważ się okazało, że są błędy postanowiłem skończyć z partyzantką.
Od dziś kilka stron będę weryfikował automatem, np. w taki sposób:
SGML_CATALOG_FILES=~/etc/xml/catalog xmllint --catalogs --noout --valid http://pinkaccordions.homelinux.org/
Jeżeli korzystamy z domyślnego /etc/xml/catalog
, to
podanie SGML_CATALOG_FILES
jest zbędne.
W tymże pliku ~/etc/xml/catalog
dodałem wpisy:
<uri name="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" uri="file:///home/tomek/etc/xml/dtd/xhtml/1.1/xhtml11.dtd" /> <uri name="http://www.w3.org/TR/ruby/xhtml-ruby-1.mod" uri="file:///home/tomek/etc/xml/dtd/xhtml/1.1/xhtml-ruby-1.mod" /> <rewriteSystem systemIdStartString="http://www.w3.org/TR/xhtml-modularization/DTD/" rewritePrefix="file:///home/tomek/etc/xml/dtd/xhtml/1.1/" /> <rewriteURI uriStartString="http://www.w3.org/TR/xhtml-modularization/DTD/" rewritePrefix="file:///home/tomek/etc/xml/dtd/xhtml/1.1/" />
Uwaga: pierwsze dwa wiersze nie wystarczą,
bo xhtml11.dtd
dołącza całą chmarę innych plików --
konkretnie 35 plików .mod
oraz 3 .ent
. Wszystkie te pliki skopiowałem do
/home/tomek/etc/xml/dtd/xhtml/1.1/
Teraz wywołuję xmllint
za pomocą prostego skryptu:
#!/bin/bash # Sprawdzanie poprawnosci wybranych stron na pinkaccordions.homelinux.org LOGFILE=~/Logs/WWW/xhtml-errors.log XMLCATALOG=~/etc/xml/catalog LINT=/usr/bin/xmllint TODAY=`date` for url in 'http://pinkaccordions.homelinux.org/wblog' 'http://pinkaccordions.homelinux.org/' ... do SGML_CATALOG_FILES=$XMLCATALOG $LINT --catalogs --noout --valid $url if [ "$?" -ne 0 ] ; then echo "Error found in $url [$TODAY]" >> $LOGFILE fi done
Ewentualnie można też tak:
#!/usr/bin/perl # Sprawdzanie poprawnosci za pomoca `W3C Markup Validation Service' use LWP::Simple; $LOGFILE='/home/tomek/Logs/WWW/xhtml-errors.log'; my $today = localtime; open LOG, ">>$LOGFILE"; my @URLs = ( 'http://validator.w3.org/check?uri=http%3A%2F%2Fpinkaccordions.homelinux.org%2Fwblog', 'http://validator.w3.org/check?uri=http%3A%2F%2Fpinkaccordions.homelinux.org', ... ); foreach $url (@URLs) { print STDERR "Sprawdzam: $url...\n"; $content = get("$url"); if ($content =~ /Information on validation.*Congratulations/m) { print STDERR "$url is OK\n" } else { print LOG "$today => errors found => $url\n" ; } } close (LOG);
W3C ma też API do serwisu walidacyjnego, ale skomplikowane to API jest...
Xmllint
ma użyteczną opcję, która pozwala
sprawdzić poprawność pliku .xml
względem zewnętrznego pliku DTD,
tj. plik nie musi zawierać deklaracji DOCTYPE
. Wygląda
jednak, że implementacja tegoż zawiera poważne błędy.
O tyle
sprawa jest dziwna, że w google na ten temat nic nie ma a błąd jest
tak oczywisty, że
powinno być. Przykładowe DTD (A.dtd
):
<!ELEMENT a (#PCDATA) > <!ATTLIST a b CDATA "Wartosc domyslna" > <!ENTITY e "Tresc encji" >
Przykładowy plik (A.xml
):
<?xml version="1.0" encoding='ISO-8859-2'?> <!-- <!DOCTYPE a SYSTEM "A.dtd"> --> <a>Przykład encji: &e;</a>
teraz uruchomienie
xmllint
z opcją dtdvalid
:
$ xmllint --dtdvalid A.dtd A.xml A.xml:3: parser error : Entity 'e' not defined
kończy się błędem...
Co się odwlecze. Francja przegrała 9 do 14. Sędzia tym razem nie pomagał. Gwizdnął słusznie faul ca 5 minut przed końcem dający Anglikom prowadzenie, potem Wilkinson dodał trzy punkty z dropa. Kibicowałem Anglikom bo byli lepsi, może nie dużo lepsi ale jednak. Dziś wieczorem RPA vs Argentyna. A w eliminacjach Anglia poległa z RPA haniebnie. Ciekawe czy już w finale będzie miała okazje do rewanżu a tym razem zagra Wilkinson.
Przy okazji: aż do wczoraj ta strona nie wyświetlała się w Operze z powodu błędu składniowego. Dla FF wszystko było OK. Sprawdziłem zatem porządnie co jest nie tak:
http://pinkaccordions.homelinux.org/wblog && \ xmllint --valid --noout wblog
i faktycznie był błąd. Teraz jest OK. W IE#6 jest kompetnie do kitu ale nie mam motywacji sprawdzać co jest nie tak.