Parsen nach Standards
Hallo Stefan.
bei den standard schem(a[s]/en/tii
wie kommt da ein parser drauf für xmlns:xs="http://www.w3.org/2001/XMLSchema"), dass etwas
ok ist oder nicht.
ganz naiv könnte man ja meinen, dass hier auf einen
wie-auch-immer gearteten conten, der unter dieser uri zu
finden ist, zugegriffen wird.
Dann bräuchtest Du ja folglich immer eine Internet-Verbindung,
wenn Du den Parser nutzen willst, was in Praxis wenig Sinn macht.
vermutlich ist es evtl. so, dass die
version des zugehörigen schemas in den parser / das
tool hineinkompiliert ist…
Ja, so wird das gemacht. Die meisten Webstandards sind mit einer
eindeutigen ID versehen, hier z.B. das XML-Schema mit
„http://www.w3.org/2001/XMLSchema“ und damit für alle
Parser eindeutig gekennzeichnet. Intern ordnet der Parser
jeder bekannten ID das komplette, intern gespeicherte Schema,
die DTD, das Stylesheet etc. zu und weiss damit, wie mit dem
Dokument umzugehen ist.
Als Beispiel für das Prinzip soll mal der Firefox 2.0 Webbrowser
herhalten, dessen Quellcode man unter ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releas…
herunterladen kann.
Beim Suchen nach den Dokumenttyp-Deklarationen, die einem HTML-Dokument
eine DTD zuordnen, findet sich in der Datei mozilla/parser/htmlparser/src/nsExpatDriver.cpp solche eine Zuordnungstabelle :
static const nsCatalogData kCatalogTable[] = {
{ "-//W3C//DTD XHTML 1.0 Transitional//EN", "xhtml11.dtd", nsnull },
{ "-//W3C//DTD XHTML 1.1//EN", "xhtml11.dtd", nsnull },
{ "-//W3C//DTD XHTML 1.0 Strict//EN", "xhtml11.dtd", nsnull },
{ "-//W3C//DTD XHTML 1.0 Frameset//EN", "xhtml11.dtd", nsnull },
{ "-//W3C//DTD XHTML Basic 1.0//EN", "xhtml11.dtd", nsnull },
{ "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN", "mathml.dtd", "resource://gre/res/mathml.css" },
{ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN", "mathml.dtd", "resource://gre/res/mathml.css" },
{ "-//W3C//DTD MathML 2.0//EN", "mathml.dtd", "resource://gre/res/mathml.css" },
{ "-//WAPFORUM//DTD XHTML Mobile 1.0//EN", "xhtml11.dtd", nsnull },
{ nsnull, nsnull, nsnull }
};
Die DTDs sind im Firefox an verschiedenen Stellen zu finden, z.B. mozilla/content/xml/content/src/xhtml11.dtd.
In der Praxis validiert der Firefox allerdings die HTML bzw.
XHTML-Dokumente nicht nach der DTD, da die meisten Webseiten
im Internet sich nicht an die DTDs halten. Er parst die
HTML-Seite intern mit einem ereignisgesteuerten Parser so gut
es geht. Insofern ist das Wissen um den Aufbau von HTML-Seiten
nicht direkt über die DTD gesteuert, sondern fest im
fehlertoleranten Parser des Browsers verankert.
Reine XML-Parser, die nach einem Standard validieren, können
dagegen streng nach DTD bzw. Schema vorgehen und haben
es dadurch einfacher.
Gruß,
-Andreas.