23.5 XML_DTD 

Besprochene Version: 0.4.2 | Lizenz: PHP-Lizenz |
Klassendatei(en): XML/DTD.php; XML/DTD/XmlValidator.php |
Das Paket XML_DTD dient primär dazu, ein XML-Dokument gegen eine DTD zu validieren. Hierzu liest das Paket die DTD ein, analysiert sie und kann dann ein XML-Dokument auf Basis der ermittelten Daten auf Gültigkeit prüfen.
Schade an diesem Paket ist, dass Fehler in der DTD leider nicht erkannt werden. Des Weiteren wird der Umgang mit Whitespaces vom Paket zurzeit noch recht streng gehandhabt.
nutzen und die dazugehörige DTD lautet
würde man auf den ersten Blick davon ausgehen, dass die XML-Datei valide ist. Das sieht XML_DTD allerdings anders. Und zwar würde in diesem Fall beanstandet, dass nach <ort> kein #PCDATA folgen darf. Und da die Whitespaces, die aus dem Zeilenumbruch und der Einrückung resultieren, als #PCDATA interpretiert werden, ergibt sich dieser Fehler.
Das heißt, entweder darf das XML-Dokument keine Whitespaces an unzulässigen Stellen enthalten und muss somit so dargestellt werden:
Oder Sie schreiben die DTD so um, dass Whitespaces enthalten sein dürfen:
<!ELEMENT ort (#PCDATA,name,#PCDATA)> <!ELEMENT name (#PCDATA)>
Die zweite Variante lässt die Nutzung von DTDs allerdings fragwürdig erscheinen, so dass ich Ihnen die erste Variante empfehlen würde.
Die eigentliche Nutzung der Kernfunktionalität des Pakets ist sehr einfach. Nachdem Sie ein Objekt der Klasse XML_DTD_XmlValidator abgeleitet haben, können Sie der Methode isValid() den Namen der DTD-Datei sowie den Namen der XML-Datei als Parameter übergeben. isValid() liefert true oder false zurück, um Ihnen mitzuteilen, ob die XML-Datei korrekt validiert werden konnte. Wenn der Rückgabewert false war, können Sie mit der Methode getMessage() die dazugehörige Fehlermeldung auslesen.
require_once('XML/DTD/XmlValidator.php'); $parser = new XML_DTD_XmlValidator; $dtd='ma.dtd'; $xml='ma.xml'; $erg=$parser->isValid($dtd,$xml); if (true===PEAR::isError($erg)) { die ($erg->getMessage()); } if (true===$erg) { echo 'Die XML-Datei konnte erfolgreich validiert werden'; } else { echo 'Bei der Validierung ist ein Fehler aufgetreten<br />'; echo htmlentities($parser->getMessage()); }
Listing 23.8 Validieren einer XML-Datei
Da sowohl die XML-Daten als auch die DTD aus einer Datei stammen und im Hintergrund noch einige weitere Pakete genutzt werden, würde ich Ihnen empfehlen zu prüfen, ob ein PEAR_Error-Objekt zurückgegeben wurde.
Hat die Methode ermittelt, dass ein Fehler vorliegt, wird die zurückgelieferte Meldung mit getMessage() ausgelesen und ausgegeben. Soll diese Meldung im Browser ausgegeben werden, ist es wichtig, dass die Meldung mit htmlentities() oder htmlspecialchars() bearbeitet wird, da die dort enthaltenen Tags sonst nicht dargestellt werden.
Die Datei XML/DTD.php sieht noch eine Möglichkeit vor, eine DTD zu analysieren und die daraus resultierenden Vorschriften als Array ausgeben zu lassen. Da die DTD zurzeit aber nicht auf Gültigkeit geprüft wird, scheint das nur bedingt sinnvoll.