我创建了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文件答案 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命名空间中有根元素 - 因此验证失败,但它有命名空间声明 - 所以当它被保存并重新加载根时元素以正确的命名空间结束,验证起作用。