XML验证,嵌套的XSD和UNC路径

时间:2011-05-10 09:41:43

标签: php xml xsd

我想使用PHP / 5.3.0上的XMLReader针对本地XSD文件验证XML文档。模式称为test.xsd,它包含对第二个模式的引用:

<?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目录是网络服务器的本地目录并且可以通过驱动器号访问,我的代码可以正常工作,例如:

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/foo/samples/common.xsd'   包含在内。

似乎PHP错误地将UNC路径误解为URL: - ?

是否有任何选项或技巧可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

会认为这也适用于linux

答案 1 :(得分:0)

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