架构验证失败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
答
据我所知,在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
在空命名空间中的根元素 - 所以验证失败,但它具有名称空间声明 - 因此,当它被保存并重新加载时,根元素将在正确的名称空间中结束,并且验证将起作用。
由于您未展示如何构建XML或XSD架构,因此您的问题根本无法得到解答。我建议你与现有的Q&A材料进行比较,至少这些材料似乎与有关该问题的某些实际信息有关:[没有匹配的全局声明可用于验证根目录](http://stackoverflow.com/questions/8426154/no-matching-global -declaration-可供所述验证根) – hakre 2013-03-05 09:33:42