【问题标题】:Problem validating XML against XSD - PHP/schemaValidate针对 XSD 验证 XML 的问题 - PHP/schemaValidate
【发布时间】:2011-08-05 12:25:14
【问题描述】:

我正在尝试使用来自DOMDocument 的函数schemaValidate(String file) 针对 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 是一种机密,抱歉,但它再次与其他一些工具一起工作得很好)。

谢谢!

【问题讨论】:

  • 第一个错误表示架构文件的权限被拒绝。你确定这不是问题吗?

标签: php xml xsd domdocument


【解决方案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() 之前。

【讨论】:

  • 它确实拥有必要的权限(拥有和 grp 到 apache,mod 755)。我刚刚尝试了 libxml_use_internal_errors(true),这就是我得到的 [1] (Code 1549) in on line 0 column 0 XML error "Failed to locate the main schema resource at '/home/public_html/product/xxxx/xxxxx/xxxx/xxxx/xsd/AdlSchema.xsd'. "
  • 抱歉,failed to open stream: Permission denied 非常明确 ;-)
  • 是的,我同意...但是我设置了所有权限,但我仍然收到我真的不明白的错误...
  • 添加了一些调试脚本sn-p。
  • 它现在可以正常工作了,我不知道我到底做了什么改变,但可以肯定这是一个访问问题...感谢调试代码,真的很有帮助
【解决方案2】:

我在使用 XML 和 XSD 模式文件的相对路径时遇到了同样的问题。但是当我把它改成绝对的之后,问题就消失了。

【讨论】:

    【解决方案3】:

    对我来说,原因是 libxml 实体加载器被禁用 (libxml_disable_entity_loader(true);)。似乎必须启用才能使用此功能。我切换到DOMDocument::validateSchemaSource,因为我不想启用实体加载器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2012-07-23
      • 2012-09-20
      • 2011-10-12
      • 2011-07-18
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多