【发布时间】:2011-05-10 09:41:43
【问题描述】:
我想在 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}包括': 加载文档失败 '/SERVER/WEB%20PROJECTS/foo/samples/common.xsd' 纳入。
似乎 PHP 将 UNC 路径误解为 URL :-?
有什么办法或技巧可以解决这个问题吗?
【问题讨论】: