架构验证失败php

问题描述:

我创建了DOMDocument元素,多次调用appendChild()等等。架构验证失败php

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

$newDocument->schemaValidate($schemaPath); 

我有错误

No matching global declaration available for the validation root. 

但是,如果我保存生成的XML文件,打开它,并确认一切正常。或者如果这样做:

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

然后一切都很好。

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

UPDATE

我如何建立我的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组织下载了它,所以我认为问题在我身边。链接到站点上的.xsd文件http://www.editeur.org/onix/2.1/reference/ONIX_BookProduct_Release2.1_reference.xsd

+0

由于您未展示如何构建XML或XSD架构,因此您的问题根本无法得到解答。我建议你与现有的Q&A材料进行比较,至少这些材料似乎与有关该问题的某些实际信息有关:[没有匹配的全局声明可用于验证根目录](http://stackoverflow.com/questions/8426154/no-matching-global -declaration-可供所述验证根) – hakre 2013-03-05 09:33:42

据我所知,在libxml的一些旧版本中,人们遇到了这个问题,它与创建元素的名称空间有关。

也许你可以尝试用createElementNS(),而不是一个简单的createElement(然后appendChild)创建你的元素,指定相同的NS作为架构文件。

我认为,你应该使用createElementNS,而不是比createElement - 即:

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

这是怎么回事的是,在内存中的DOMDocument在空命名空间中的根元素 - 所以验证失败,但它具有名称空间声明 - 因此,当它被保存并重新加载时,根元素将在正确的名称空间中结束,并且验证将起作用。