XML-Validator in PHP
Andreas Korthaus
- php
Hallo!
Komischerweise bieten die XML-Funktionen von PHP keine Möglichkeit ein XML-Dokument zu validieren und auch in PEAR habe ich da nichts gefunden, und auch Google war da wenig auskunftsfreudig.
Kennt da jemand irgendwas? Oder - wie kompliziert ist es sowas selbst zu schreiben? Eigentlich müßte man doch "nur" die DTD und die XML-Datei parsen, die DTD "verstehen" und der DTD entsprechend das XML-Dokument überprüfen. Aber wenn das so einfach wäre gäbs da vermutlich schon eine Funktion für. Was braucht man denn alles?
ich würde jetzt mal die XML-Datei in einen mehrdimensionalen Array schreiben, also aus
<artikel>
<name>Rasenmäher</name>
<preis>12,32</preis>
</artikel>
Die DTD dazu sähe z.B. so aus:
<!ELEMENT artikel (name,preis)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT preis (#PCDATA)>
Würde ich jetzt mal
array( "artikel" =>
array( "name" => "#PCDATA",
"preis" => "#PCDATA"
)
)
machen.
Das könnte ich jetzt wieder parsen in einen Array
array("artikel" =>
array( "name",
"preis"
),
"name" => "#PCDATA",
"preis" => "#PCDATA"
)
Und jetzt gehe ich in einer Schleife das erste Element XML-Daten arrays durch und prüfe da wieder in einer Schleife ob alle Elemente von "artikel" auch in dem DTD array in "artikel" vorkommen(in_array($dtd_data["artikel"])).
Das mache ich dann wieder in einer Schleife mit jedem einzelnen Element.
Was gäbs dann noch zu beachten? ANY, +, *, ?, sonst noch was? Naja, Attribute fehlen noch udn die ein oder andere "Kleinigkeit", haltet Ihr das für schwierig sowas selbst zu schreiben? Oder gibt es da was fertiges was ich verwenden könnte(wäre mir am liebsten, denn auf den 2. Blick würde das wohl doch etwas komplexer als auf den 1. ;-))?
Viele Grüße
Andreas
PS: In PERL gibts da vermutlich wieder ein Modul für, oder?
Hallo!
Komischerweise bieten die XML-Funktionen von PHP keine Möglichkeit ein XML-Dokument zu validieren und auch in PEAR habe ich da nichts gefunden, und auch Google war da wenig auskunftsfreudig.
Eigentlich schon! Mit DOMXML geht das.
http://www.phpindex.com/articles/articles_lire.php3?element=313
siehe letzte Nachricht:http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&threadm=a5t8ci%244jt%2402%241%40news.t-online.com&rnum=2&prev=/groups%3Fq%3D%252Bphp%2B%252Bdtd%2B%252Bvalidieren%2Bgroup:de.*%26hl%3Dde%26lr%3D%26ie%3DUTF-8%26selm%3Da5t8ci%25244jt%252402%25241%2540news.t-online.com%26rnum%3D2
http://groups.google.de/groups?q=%2Bxmllint+%2Bphp+%2Bdtd&hl=de&lr=&ie=UTF-8&oe=UTF-8&selm=9qjgl6%24eje%241%40sunsite.dk&rnum=1
http://xmlsoft.org/xmldtd.html
Man könnte ja exec() verwenden. Es muß natütlich xmllint installiert sein.
Kennt da jemand irgendwas?
Siehe Links, so würde ich anfangen!
Oder - wie kompliziert ist es sowas selbst zu schreiben?
Ich würde es nicht versuchen. Eine DTD kann viele Formen haben. Es können ja die verrücktesten UND/ODER/KANN/NICHT-Verknüpfungen vorkommen.
MfG, André Laugks
L-Andre @ gmx.de
Hallo!
Eigentlich schon! Mit DOMXML geht das.
http://www.phpindex.com/articles/articles_lire.php3?element=313
So, das steht da:
<?php
$error = array();
// chargement en mémoire du fichier xml
$dom = @xmldocfile('test.xml', DOMXML_LOAD_VALIDATING, $error);
// test pour voir si le document xml est 'well formed'
if(!is_object($dom)){
echo("Le document XML n'est pas 'Well Formed' !\n");
die(print_r($error));
}
// test pour voir si le document est conforme à sa DTD
if(!@domxml_doc_validate($dom, $error)){
echo "Validation DTD n'est pas OK\n";
print_r($error);
} else {
echo "Validation OK\n";
}
?>
Hat sich wohl etwas an den Funktionen geändert:
xmldocfile() => domxml_open_file()
aber wo um himmelswillen gibt es die Funktion domxml_doc_validate() ?
http://php3.de/manual-lookup.php?pattern=domxml_doc_validate&lang=en
Das Wort "validate" kommt nirgendwo in der domxml Referenz vor auch nicht bei der Suche im XML-Zusammenhang.
Und soweit mir das meine spärlichen Französisch-Kenntnisse zulassen habe ich das so verstanden das es sich hierbei durchaus um eine feste PHP-Funktion handeln sollte. Liget vermutlich daran das das alles noch nur im CVS liegt und noch sehr experimentellen Charakter hat. Und auch die PEAR-Lösung ist eine experimentelle Klasse aus dem CVS. Vielleicht sollte ich solche Sachen vielleicht doch lieber PERL oder einem anderen Tool überlassen, zuminmdest vorerst. Oder weiß Du welche _aktuellen_ Funktionen ich zu verwenden habe(http://www.php.net/manual/en/ref.domxml.php)?
Ich habe mich ein wenig weiter in DTDs und das Perl-Modul XML::Checker::Parser (http://search.cpan.org/author/ENNO/libxml-enno-1.02/lib/XML/Checker/Parser.pm) angesehen, wie es ausshieht ist es _das_ PERL Modul wenn es um Validierung von XML/DTDs geht, oder kennt da jemand noch was besseres/einfacheres...?
Viele Grüße und Danke für die Links!
Andreas
PS: Was hat das ganze eigentlich großartig mit DOM zu tun? Ich dachte immer DOM sei eine Art freier Javascript-Nachfolger?!
Hallo Andreas,
PS: Was hat das ganze eigentlich großartig mit DOM zu tun?
Ich dachte immer DOM sei eine Art freier
Javascript-Nachfolger?!
Unfug. DOM beschreibt ein Objekt-Modell, bzw. eine API, die
*eine* Zugriffs-Ar auf Dokumente (HTML, XML) bietet und
beschreibt. Wenn w3c.org jetzt erreichbar waere, wuerd ich dir
'nen Link geben...
Gruesse,
CK
Hallo!
Habe dann auch mal nach domxml gegoogelt, und siehe da, da findet man plötzlich ne ganze Menge, z.B.: http://chregu.tv/domxml/
Da sind 2 interessante Scripte:
<?php
// surpress warnings
$xmldoc = @domxml_open_file("validate.xml",DOMXML_LOAD_VALIDATING,$error);
print "<pre>";
print_r($error);
?>
und
<?php
// surpress warnings
$xmldoc = @domxml_open_file("validate.xml");
@$xmldoc->validate($error);
print "<pre>";
print_r($error);
?>
Das ist ja schön und gut, nur wie kommt man an dieses Wissen?
http://www.php.net/manual/en/ref.domxml.php
http://www.php.net/manual/en/function.domxml-open-file.php
da steht überhaupt nichts zu dem wie es da oben umgesetzt wurde. Z.B. "DOMXML_LOAD_VALIDATING", woher soll ich bitte wissen das es das gibt? Oder $xmldoc->validate($error);
wo ist das dokumentiert?
Viele Grüße
Andreas
PS: Aber überall steht auch dabei dass man das bloß noch nicht auf Produktions-Servern einsetzen soll!
Hallo!
Das ist ja schön und gut, nur wie kommt man an dieses Wissen?
http://www.php.net/manual/en/ref.domxml.php
http://www.php.net/manual/en/function.domxml-open-file.phpda steht überhaupt nichts zu dem wie es da oben umgesetzt wurde. Z.B. "DOMXML_LOAD_VALIDATING", woher soll ich bitte wissen das es das gibt? Oder $xmldoc->validate($error);
wo ist das dokumentiert?
Suchen suchen suchen!
Du wagst Dich da in ein Bereich (PHP und XML/DOMXML) vor, den noch sehr Jung ist. Die DOMXML-Extension ist immer noch als "EXPERIMENTELL" eingestuft.
MfG, André Laugks
L-Andre @ gmx.de
Hallo!
Suchen suchen suchen!
lustig ;-) Wenn ich jetzt PHP-Entwickler wäre, dann müßte ich doch irgendwie dokumentieren welche Parameter man bei einer Funktion verwenden kann - wo machen die das, oder muß jeder der damit was machen will hierfür im Quelltext des Moduls wühlen? Ich meine es gibt ja schon eine offiziell Dokumentation im Manual, aber halt nicht vollständig, dasselbe Problem hatte ich auch mal mit curl, gibt es irgendwo noch eine CSV-Doku oder sowas? Wenn ich suche finde ich einige Beispiele, aber die müssen doch alle irgendwo Ihre Infos her haben!
Du wagst Dich da in ein Bereich (PHP und XML/DOMXML) vor, den noch sehr Jung ist. Die DOMXML-Extension ist immer noch als "EXPERIMENTELL" eingestuft.
Das habe ich gemerkt, daher werde ich es auch erstmal nicht verwenden, aber ich will es schon gerne im Hinterkopf behalten. Ich denke ich verwende das bei Linux standardmäßig mitgelieferte Tool, xmllins oder so ähnlich.
Das scheint jedenfalls zu funkitonieren.
Jedenfalls vielen Dank!
Grüße
Andreas