2013-03-04 5 views
-1

Я создал 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

ответ

1

Насколько я знаю, с некоторыми более старыми версиями libxml люди сталкиваются с этой проблемой, это связано с пространствами имен, на которых создаются элементы.

Возможно, вы можете попробовать создать свои элементы с помощью createElementNS() вместо простого createElement (и затем appendChild), указав тот же NS, что и файл схемы.

0

Я считаю, что вы должны использовать createElementNS вместо чем createElement - то есть:

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

Что происходит в том, что DOMDocument в памяти имеет корневой элемент в нулевом пространстве имен - и поэтому не проходит проверку, но имеет объявление пространства имен - и поэтому, когда он сохраняется и перезагружается, корневой элемент заканчивается в правильном пространстве имен, и проверка выполняется.

Смежные вопросы