Après la mise à niveau de PHP 5.2.8 à 5.3.3, la nouvelle fonction libxml_disable_entity_loader(false)
ne semble pas fonctionner sur Windows via une ligne de commande vers un fichier PHP sur un partage réseau. Plus précisément, DOMDocument::schemaValidate()
échoue avec les fichiers XSD qui contiennent plusieurs niveaux d'include() imbriqués vers d'autres fichiers XSD sur un partage réseau.PHP 5.3.3 ne parvient pas à valider le XML par rapport aux XSD
L'exemple ci-dessous me porte à croire que l'appel de fonction à libxml_disable_entity_loader(false)
n'est pas honoré en PHP avec des fichiers XSD qui contiennent plusieurs niveaux de include() XSD imbriqués.
Ai-je raté quelque chose ici ou pensez-vous qu'il s'agit d'un bug avec PHP ou éventuellement libxml?
À Répliquer:
Test 1 (succès):
"C:\PHP\5.3.3\php.exe" -c "C:\PHP\5.3.3\php.ini" "C:\Temp\validate.php"
- L'exemple de ligne de commande Windows ci-dessus utilise un chemin codé en dur et non un dossier Windows partagé.
- Il résultera avec succès "passé" dans PHP 5.2.8 et PHP 5.3.3.
Test 2 (échec):
"C:\PHP\5.3.3\php.exe" -c "C:\PHP\5.3.3\php.ini" "\\192.168.82.99\Deployment\Temp\validate.php"
- Faites un clic droit sur votre lecteur C:> Propriétés> Partager> Nouveau Partager> Nom de l'action: "Déploiement"
- Modifier la Adresse IP dans l'exemple de ligne de commande ci-dessus pour correspondre à votre machine locale.
- L'exemple de ligne de commande Windows ci-dessus utilise les mêmes fichiers mais via un dossier partagé Windows.
- En PHP 5.2.8, il sera répercuté "passé".
- En PHP 5.3.3, il se fera l'écho « échoué » et produire les avertissements PHP suivants à propos de « Échec de chargement entité externe » et « Impossible de charger le document »:
L'exécution de la ligne de commande ci-dessus par exemple en PHP 5.3.3 produit:
Warning: DOMDocument::schemaValidate(): I/O warning : failed to load external entity "/192.168.82.99/DEPLOYMENT/Temp/grandparent.xsd" in \\192.168.82.99\DEPLOYMENT\Temp\validate.php on line 8
Warning: DOMDocument::schemaValidate(): Element '{http://www.w3.org/2001/XMLSchema}include': Failed to load the document '/192.168.82.99/DEPLOYMENT/Temp/grandparent.xsd' for inclusion. in \\192.168.82.99\DEPLOYMENT\Temp\validate.php on line 8
Warning: DOMDocument::schemaValidate(): Invalid Schema in \\192.168.82.99\DEPLOYMENT\Temp\validate.php on line 8
failed
fichiers nécessaires à l'REPLIQUER:
Placez tous ces fichiers i n "C: \ Temp \" (ou modifier vos chemins dans les exemples de ligne de commande)
validate.php
<?php
chdir(dirname(__FILE__));
libxml_disable_entity_loader(false);
$xmlDoc = new DomDocument();
$xmlDoc->load('sample.xml');
echo $xmlDoc->schemaValidate('child.xsd') ? 'passed' : 'failed';
?>
sample.xml
<?xml version="1.0"?>
<team mascot="cowboys" />
enfant.xsd
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified" >
<!-- The include below works -->
<xsd:include schemaLocation="parent.xsd" />
<xsd:element name="team" type="baseTeam" />
</xsd:schema>
parent.xsd
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified" >
<!-- The include below fails in PHP 5.3.3 even though libxml_disable_entity_loader(false) is called! -->
<xsd:include schemaLocation="grandparent.xsd" />
<xsd:complexType name="baseTeam">
<xsd:attribute name="mascot" type="mascotNames" use="required" />
</xsd:complexType>
</xsd:schema>
grandparent.xsd
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified" >
<xsd:simpleType name="mascotNames">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="bengals" />
<xsd:enumeration value="cowboys" />
<xsd:enumeration value="patriots" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Ceci est probablement lié libxml2, pas un problème de PHP lui-même. Essayez d'utiliser la même version de libxml dans PHP 5.2 et 5.3. Si le problème persiste, [envoyez un rapport de bogue] (http://bugs.php.net/). – Artefacto
Fonctionne bien pour moi en utilisant PHP 5.3.3/winxp/php.net-build. – VolkerK