Почему эта проверка 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"), но ваш документ экземпляра не объявляет это пространство имен или любое другое. Так что фу на самом деле не совпадают.