我正在尝试使用schemaValidate(String file)
中的函数DOMDocument
针对XSD验证XML文件。
当我在其他工具(如在线验证器)上验证它时,它工作正常,但在我的程序中,我总是收到此错误,实际上无法找到它来自哪里:
Warning: DOMDocument::schemaValidate(/home/public_html/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 "/home/public_html/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 '/home/public_html/product/xxxxx/xxxxx/xxxxx/xxxx/xsd/AdlSchema.xsd'. in /home/public_html/xxxx/xxxxx.php on line 209 Warning: DOMDocument::schemaValidate(): Invalid Schema in /home/public_html/xxxx/xxxx.php on line 209
所以我的问题是,有没有办法通过DOMDocument函数获取有关此错误的更多详细信息(主要是Invalid schema one)?如果有人能说出什么可能会导致那种错误的错误(xml和xsd是一种保密,抱歉,但是再一次使用其他一些工具就可以了。)
谢谢!
答案 0 :(得分:1)
/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()之前。
答案 1 :(得分:0)
我使用XML和XSD架构文件的相对路径遇到了同样的问题。但是在我把它改成绝对的之后,问题就消失了。
答案 2 :(得分:0)
对我来说,原因是禁用了libxml实体加载器(libxml_disable_entity_loader(true);
)。似乎必须启用此功能。我切换到DOMDocument::validateSchemaSource
是因为我不想启用实体加载器。