Почему эта проверка XML через XSD терпит неудачу в libxml2 (но успешно в xmllint) и как ее исправить?

если я запустил это проверка XML via xmllint:

xmllint --noout --schema schema.xsd test.xml

Я понимаю это успехов сообщение:

.../test.xml validates

однако, если я запускаю та же проверка via C API libxml2:

int result = xmlSchemaValidateDoc(...)

Я возвращаемое значение 1845 и провал сообщение:

Element '{http://example.com/XMLSchema/1.0}foo': No matching global declaration available for the validation root.

который я не могу понять абсолютно никакого смысла. :(


схемы.имя xsd:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" >
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com/XMLSchema/1.0" targetNamespace="http://example.com/XMLSchema/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:element name="foo">
    </xs:element>
</xs:schema>

3 ответов


после получения некоторой помощи на xml-список рассылки проекта gnome похоже, что мой ошибка не вызвана моей ошибкой, а скорее ошибка OSX 10.6.распределение x (v2.7.3) libxml2.
(как в: тот же код работает для других, но не для меня OSX ' legacy distribution)

Я проверил заметки о выпуске libxml2 и нашел двух кандидатов:

примечания к выпуску обновления 2.7.4 перечислите следующую ошибку исправить:

  • " 579746 проверка XSD не правильная / nilable группы (Daniel Veillard)"

заметки из списка обновлений 2.7.8 следующие исправления:

  • " исправить ошибки в двойной проверке проверки XSD (Csaba Raduly)"

еще не было успеха в получении последней сборки (v2.7.8) libxml2 для работы с моим проектом (или, скорее, Xcode в целом).


Я пробовал ваш контент и код на Ubuntu Linux. Работал без возражений.

построить команду:

gcc -Wall -I/usr/include/libxml2 main.c -lxml2 -o xmlvalid 

выполнить команду:

./xmlvalid ./schema.xsd ./test.xml

выход:

XSD File: ./schema.xsd
XML File: ./test.xml

источник XML:

<?xml version="1.0" encoding="UTF-8"?>

<foo xmlns="http://example.com/XMLSchema/1.0">
</foo>

проверка прошла успешно: да (результат: 0)


ваша схема помещает элемент foo в targetNamespace (это то, что означает elementdefault="qualified"), но ваш документ экземпляра не объявляет это пространство имен или любое другое. Так что фу на самом деле не совпадают.