Valider la syntaxe d'un fichier XML sans DTD

Petit nouveau ! | 5 Messages

08 juil. 2012, 12:27

Bonjour, je suis nouveau ici, bonjour à tous !

Voici le premier soucis qui me fait venir à vous.
J'ai une petite application PHP5 qui reçoit de la part d'un logiciel (dont je n'ai pas la main sur la syntaxe) des fichiers XML par upload FTP.
Les fichiers ont un temps de copie, et souvent mon script commence à ouvrir un XML alors qu'il n'a pas fini d'être copié. Résultat ça engendre des erreurs.
Avant mon ancienne application m'envoyait des XML faisant référence à une DTD, donc avec SimpleXML je n'avais qu'à utiliser l'option LIBXML_DTDVALID et je pouvais faire patienter les fichiers encore incomplet car ils ne passaient pas les contrôles.

Ce que je cherche idéalement, ça serait une option pour SimpleXML qui me permette de valider que mon fichier XML est terminé, c'est à dire que le corps à correctement été fermé. Le contrôle de la structure je vais en faire mon deuil.
Si SimpleXML ne sait pas faire (j'ai lu la page de manuel, rien ne m'a sembler coller à mon besoin) connaissez vous une autre solution pas trop compliquée ?

ViPHP
ViPHP | 2577 Messages

09 juil. 2012, 09:20

Normalement, un fichier XML a un élément racine unique. tu peux vérifier la présence du tag de fermeture de cet élément en fin de fichier.

Eléphant du PHP | 267 Messages

09 juil. 2012, 09:44

salut,

il n'y a pas que les DTD
il y a aussi les XML Schema et Relax NG

@+
dix2

Petit nouveau ! | 5 Messages

09 juil. 2012, 19:48

Salut,

@Mazarini : Oui je sais bien, je voudrais éviter un code crado qui détecterait juste la bonne fermeture mais négligerait une structure complétement endommagée au milieu du fichier. J'utiliserais effectivement ce genre de contrôle si je ne trouve rien ...

@dix2 : merci pour les pistes, je vais regarder ceci.

Je vais aussi explorer ceci : DOMXML_LOAD_VALIDATING, j'ai l'impression que ça pourrait être pas mal.

Petit nouveau ! | 5 Messages

09 juil. 2012, 22:16

J'ai trouvé !

Code : Tout sélectionner

<?php $xml = new DOMDocument; if ($xml->load("test.xml") === true ) { echo "ok"; } else { echo "ko"; } ?>
DOM est très strict, il balance un warning pour chaque erreur de grammaire XML, et le résultat du test passe à false dans le test.
Merci pour votre assistance !