【问题标题】:PHP DOMDocument ignoring XSD SchemaPHP DOMDocument 忽略 XSD 架构
【发布时间】:2013-03-06 14:03:21
【问题描述】:

验证任何 VAST2.0 XML 代码

$xsdPath='https://github.com/chrisdinn/vast/blob/master/lib/vast_2.0.1.xsd'
$domdoc= new DOMDocument(); 
$domdoc->loadHTML($xml_input); 
if(!$domdoc->schemaValidate($xsdPath)){/* ... */}

返回诸如Error 1845: Element 'html': No matching global declaration available for the validation root.之类的无意义消息

在我看来,这并没有什么意义,因为模式 xsd 和庞大的 xml 都不包含或不需要名称为 的标记或元素。

用同样的方法尝试

$reader = new XMLReader();
$reader->XML($xml_input);
$valid = $reader->setSchema($xsdPath);
$reader->read();
$reader->close();

返回相同的错误代码。

我检查了 xsd twiche。和https://github.com/chrisdinn/vast/blob/master/lib/vast_2.0.1.xsd一样。

知道如何解决这个问题吗?

【问题讨论】:

  • 你能发布$xml_input的内容吗?

标签: php xml xsd


【解决方案1】:

要加载 XML,您应该使用 loadXML(),而不是 loadHTML():

$xsdPath = 'https://raw.github.com/chrisdinn/vast/master/lib/vast_2.0.1.xsd';
//                  ^^^
//                  using raw version
$domdoc= new DOMDocument();
$domdoc->loadXML($xml_input);
//           ^^^
//           Not loading HTML here
if (!$domdoc->schemaValidate($xsdPath)) {
    // ...
}

【讨论】:

    【解决方案2】:

    当我取消引用您为 XSD 架构文档提供的 URI 时,我没有得到 XSD 架构文档。我得到一个 HTML 文档,它显示了 XSD 模式文档的呈现。对于一个期望看到 xs:schema 元素来发出您引用的错误消息的验证器来说,这对我来说非常有意义,而它却看到了一个 HTML 元素。

    您可以找到一个 URI,它实际上为您的验证器所需的 XML 文档提供服务,或者您可以制作一个本地副本并指向该本地副本。但是,期望 PHP 的模式验证能够找到隐藏在 HTML 中的 XSD 文档,这超出了您的合理预期。

    【讨论】:

    • 您所写的内容通常是正确的,但是,想象一下使用了正确的 URI(例如https://raw.github.com/chrisdinn/vast/master/lib/vast_2.0.1.xsd)并且问题仍然存在,那么您的结论是什么? (如果您回答的是实际发生的情况,PHP 会告诉它无法加载 XSD 并且没有给出问题中概述的具体验证错误)
    • @hakre,XSD 规范确实要求 XSD 验证器根据模式文档的模式验证模式文档。如果给验证器一个 URI 并要求加载一个模式文档,而是在那里找到一个 HTML 文档,并且没有抱怨“模式文档”根部的 HTML 元素,那么我倾向于说它的错误诊断可能会更好。如果使用了正确的 URI 并且出现了相同的错误消息,那么我会像 Ian Wood 一样要求查看 XML 输入。
    【解决方案3】:

    错误是相当直接的:

    错误 1845:元素“html”:没有可用于验证根的匹配全局声明。

    表示元素 <html> 未在 XSD 中声明,因此无法使用该 XSD 验证文档。

    在我看来,这并没有什么意义,因为模式 xsd 和庞大的 xml 都不包含或不需要带有名称的标记或元素。

    您正在加载一个 HTML 文档。无论字符串/文件是否包含该 html 元素,DOMDocument 确实包含它,因此验证会尝试针对 XSD 对其进行验证,然后由于 XSD 没有任何声明而失败。

    【讨论】:

    • 如果你使用 loadHTML,即使是 XML 也会变成 HTML :)
    • 是的,此时 DOMDocument 处于 HTML 模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多