1

验证任何 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 都不包含或不需要带有 name 的标记或元素。

尝试相同的

$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上的一样。

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

4

3 回答 3

1

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

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

于 2013-03-05T15:44:33.243 回答
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)) {
    // ...
}
于 2013-03-06T05:56:26.407 回答
0

错误很简单:

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

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

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

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

于 2013-03-06T05:45:38.857 回答