架构验证失败了php

时间:2013-03-04 18:24:24

标签: php xml xsd domdocument

我创建了DOMDocument元素,多次调用appendChild()等等。

完成XML构建后,我想validate it against an XSD schema

$newDocument->schemaValidate($schemaPath);

我收到了错误

No matching global declaration available for the validation root. 

但是,如果我将生成的XML保存到文件,打开它并验证一切正常。或者,如果做类似的事情:

$newDocument->loadXML($newDocument->saveXML());

然后一切都很好。

你能解释一下,为什么验证者在第一种情况下找不到根元素?

更新

我如何构建我的xml:

$newDocument = new DOMDocument();

$rootElement = $newDocument->createElement('ONIXMessage');

$rootElement->setAttribute('xmlns', 'http://www.editeur.org/onix/2.1/reference');

$newDocument->appendChild($rootElement);

我将子元素添加到根元素后,但是当我尝试根据XML模式验证它时,甚至列出的代码都会生成错误。

关于xml架构文件。我是从EDItEUR组织下载的,所以我相信问题就在我身边。链接到网站http://www.editeur.org/onix/2.1/reference/ONIX_BookProduct_Release2.1_reference.xsd

上的.xsd文件

2 个答案:

答案 0 :(得分:1)

据我所知,对于某些旧版本的libxml,人们会遇到这个问题,它与创建元素的命名空间有关。

也许您可以尝试使用createElementNS()创建元素,而不是简单的createElement(然后是appendChild),指定与模式文件相同的NS。

答案 1 :(得分:0)

我认为您应该使用createElementNS而不是createElement - 即:

$newDocument = new DOMDocument();
$rootElement = $newDocument->createElementNS('http://www.editeur.org/onix/2.1/reference', 'ONIXMessage');
$newDocument->appendChild($rootElement);

发生的事情是内存中的DOMDocument在null命名空间中有根元素 - 因此验证失败,但它有命名空间声明 - 所以当它被保存并重新加载根时元素以正确的命名空间结束,验证起作用。