我想使用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: - ?
是否有任何选项或技巧可以解决这个问题?
答案 0 :(得分:1)
我遇到了类似的问题,我唯一能解决的问题是使用从本地硬盘到UNC路径(窗口)的符号链接:mklink /D "C:\SomeDir" "//Some//UNC//Path"
会认为这也适用于linux
答案 1 :(得分:0)
如果没有看到存储\\SERVER\WEB PROJECTS\foo\sample
的字符串是什么样的话,很难回答。这可能是需要转义的原因,因为\\
生成\
,生成\\\\
需要\\
。