我正在尝试使用
schemaValidate(String file)
中的 DOMDocument
函数根据 XSD 验证 XML 文件。
当我在其他工具(例如在线验证器)上验证它时,它工作正常,但在我的程序中我总是收到此错误并且确实找不到它来自哪里:
Warning: DOMDocument::schemaValidate(product/xxxx/xxxx/xxxxx/xsd/AdlSchema.xsd):
failed to open stream: Permission denied in /home/public_html/xxxx/xxxx.php on line 209
Warning: DOMDocument::schemaValidate(): I/O warning :
failed to load external entity "product/xxxx/xxxx/xxxx/xxxx/xsd/AdlSchema.xsd" in /home/public_html/xxxx/xxxx.php on line 209
Warning: DOMDocument::schemaValidate(): Failed to locate the main schema resource
at 'product/xxxxx/xxxxx/xxxxx/xxxx/xsd/AdlSchema.xsd'. in xxxx/xxxxx.php on line 209
Warning: DOMDocument::schemaValidate(): Invalid Schema in xxxx/xxxx.php on line 209
所以我的问题是,有没有办法使用 DOMDocument 函数获取有关此错误(主要是无效架构)的更多详细信息?如果有人能说出什么可能导致这种错误,那就太好了(xml 和 xsd 是一种机密,抱歉,但它再次与其他一些工具一起工作得很好)。
/home/public_html/product/xxxx/xxxx/xxxxx/xsd/AdlSchema.xsd): 无法打开流: 权限被拒绝php 进程没有访问 xsd 文件所需的权限。
让我们稍微研究一下并添加一些调试/信息代码 请添加
/* debug code start. Don't forget to remove */
// if there already is a variable you use as parameter for schemaValidate() use that instead of defining a new one.
$path = '/home/public_html/product/xxxx/xxxx/xxxxx/xsd/AdlSchema.xsd';
foreach( array('file_exists', 'is_readable', 'is_writable') as $fn ) {
echo $fn, ': ', $fn($path) ? 'true':'false', "<br />\n";
}
$foo = stat($path);
echo 'mode: ', $foo['mode'], "<br />\n";
echo 'uid: ', $foo['uid'], "<br />\n";
echo 'gid: ', $foo['gid'], "<br />\n";
if ( function_exists('getmyuid') ) {
echo 'myuid: ', getmyuid(), "<br />\n";
}
if ( function_exists('getmygid') ) {
echo 'myuid: ', getmygid(), "<br />\n";
}
$foo = fopen($path, 'rb');
if ( $foo ) {
echo 'fopen succeeded';
fclose($foo);
}
else {
echo 'fopen failed';
}
/* debug code end */
在调用 schemaValidate() 之前。
我使用 XML 和 XSD 架构文件的相对路径遇到了同样的问题。但当我将其更改为绝对值后,问题就消失了。
对我来说,原因是 libxml 实体加载器被禁用(
libxml_disable_entity_loader(true);
)。看来要启用这个功能才行。我切换到 DOMDocument::validateSchemaSource
,因为我不想启用实体加载器。