-1

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

在我完成构建 XML 后,我想根据 XSD 模式对其进行验证

$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 文件

4

2 回答 2

1

As far as I know, with some older versions of libxml people come across this issue, it's related to the namespaces the elements are created on.

Maybe you can try to create your elements with createElementNS() instead of a simple createElement (and then appendChild), specifying the same NS as the schema file.

于 2013-03-04T18:39:06.103 回答
0

我相信你应该使用createElementNS而不是createElement- 即:

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

发生的事情是DOMDocument内存中的根元素在 null 命名空间中-因此验证失败,但它具有命名空间声明-因此当它被保存并重新加载时,根元素最终位于正确的命名空间中,并且验证有效。

于 2013-03-05T15:16:57.560 回答