2011-05-10 76 views
1

我想在PHP/5.3.0上使用XMLReader针对本地XSD文件验证XML文档。该模式被称为test.xsd,它包含第二模式的参考:XML验证,嵌套XSD和UNC路径

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

我把所有的文件在同一目录下复制。代码的相关部分看起来是这样的:

<?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(); 

?> 

我的代码工作正常如果samples目录是本地的Web服务器,并到达由盘符,如:

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

但是,实际数据位于可通过UNC路径到达的网络驱动器中:

\\SERVER\WEB PROJECTS\foo\samples 

这里是问题:在这种情况下(并且只在这种情况下)PHP加载test.xsd就好,但它找不到common.xsd。我得到一个警告:

警告:的XMLReader ::的setSchema() [xmlreader.setschema]:无法设置 模式。这必须在 之前设置,否则架构包含错误。

...和下​​面的XML错误:

警告1549(开始元素):未能 加载外部实体 “/SERVER/WEB%20PROJECTS/foo/samples/common.xsd “

错误3050(开始元素):元素 '{http://www.w3.org/2001/XMLSchema}include': 未能加载文件 “/ SERVER/WEB%20PROJECTS /富/包含samples/common.xsd' 。

看来,PHP是曲解UNC路径作为一个URL: - ?

有没有任何选择或技巧来解决这个问题?

回答

1

我遇到了类似的问题,我可以解决这个问题的唯一方法是使用本地硬盘一个符号链接UNC路径(窗口):mklink /D "C:\SomeDir" "//Some//UNC//Path"

会想到,这也将在Linux上

+0

我最终感到厌倦,只是将所有重要的网络路径都链接起来。有太多的应用程序不支持UNC。 – 2016-08-18 06:09:36

0

如果没有看到存储\\SERVER\WEB PROJECTS\foo\sample字符串的字符串很难回答。这可能是需要转义的原因,因为\\产生\,需要\\\\来产生\\

+0

工作那么,PHP能够使用相同的路径来查找'test.xml'和'test.xsd',但不能找到位于同一目录中的'common.xsd'。我如何影响libxml在内部处理路径的方式? – 2011-05-11 07:08:13