2010-10-20 5 views
2

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> 
+0

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

+0

Fonctionne bien pour moi en utilisant PHP 5.3.3/winxp/php.net-build. – VolkerK

Répondre

2
$dir = dirname(__FILE__) . '/sources/'; 
$file = $dir . 'data.xml'; 
$xml = file_get_contents($file); 

$doc = new DOMDocument; 
$doc->documentURI = $file; 
$doc->loadXML($xml); 
$doc->xinclude(); 

echo $doc->schemaValidate($dir . 'child.xsd') ? 'passed' : 'failed'; 
Questions connexes