2011-05-10 2 views
1

Je souhaite valider un document XML par rapport à un fichier XSD local en utilisant XMLReader sur PHP/5.3.0. Le schéma est appelé test.xsd et il contient une référence à un second schéma:Validation XML, chemins XSD et UNC imbriqués

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:include schemaLocation="common.xsd"/> 

J'ai une copie de tous les fichiers dans le même répertoire. La partie pertinente du code ressemble à ceci:

<?php 

define('DIR_XML', dirname(__FILE__) . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR); 

$oXMLReader = new XMLReader; 

$oXMLReader->open('test.xml'); 
$oXMLReader->setSchema(DIR_XML . 'test.xsd'); 

while($oXMLReader->read()){ 
} 
$oXMLReader->close(); 

?> 

Mon code fonctionne très bien si le répertoire samples est local au serveur Web et accessible par une lettre de lecteur , par exemple:

define('DIR_XML', 'C:\samples' . DIRECTORY_SEPARATOR); 

Cependant, des données réelles est dans un lecteur réseau accessible par chemin UNC:

\\SERVER\WEB PROJECTS\foo\samples 

Et voici le problème: dans ce cas (et seulement dans ce cas) PHP charge test.xsd très bien, mais il ne peut pas trouver common.xsd. Je reçois un avertissement:

Attention: XMLReader :: setSchema() [xmlreader.setschema]: Impossible de définir schéma. Cela doit être défini avant la lecture ou le schéma contient des erreurs.

... et les erreurs XML suivantes:

Avertissement 1549 (élément Lancer): Échec chargement entité externe « /SERVER/WEB%20PROJECTS/foo/samples/common.xsd "

erreur 3050 (Démarrer élément): Element '{http://www.w3.org/2001/XMLSchema}include': Impossible de charger le document «/SERVEUR/WEB% 20PROJECTS/foo/samples/common.xsd ' pour l'inclusion.

Il semble que PHP interprète mal le chemin UNC comme une URL: -?

Y at-il une option ou un truc pour résoudre ce problème?

Répondre

1

je suis tombé sur un problème similaire et la seule façon que je pouvais le réparer utilisait un lien symbolique du disque dur local chemin UNC (fenêtres): mklink /D "C:\SomeDir" "//Some//UNC//Path"

aurait pensé que ce serait aussi travailler sur linux

+0

Je me suis finalement fatigué et j'ai simplement symbolisé tous mes chemins réseau importants. Il y a juste trop d'applications qui ne supporteront pas UNC. –

0

Il est difficile de répondre sans voir à quoi ressemble la chaîne de caractères \\SERVER\WEB PROJECTS\foo\sample. Cela peut être une cause d'échappement nécessaire, car \\ produit \, et \\\\ est nécessaire pour produire \\.

+0

Eh bien, PHP est capable d'utiliser ce même chemin pour trouver 'test.xml' et' test.xsd', mais pas 'common.xsd' qui se trouve dans le même répertoire. Comment puis-je affecter la façon dont libxml gère le chemin en interne? –