У меня есть небольшой проект (на C ++ Linux Ubuntu 14.04), где я пытаюсь проанализировать некоторые документы XML с использованием libxml2. Когда я получаю XML-файл, я пытаюсь его проверить. Но есть некоторые неприятные ошибки!
Я нашел информацию об использовании нескольких схем .xsd во время проверки. Для этого важно создать документ .xsd с элементами «import» (для каждой схемы .xsd), которые имеют элемент «schemaLocation».
Вот моя схема .xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://osll.converter-schema"targetNamespace="http://osll.converter-schema"xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:OAI-PMH="http://www.openarchives.org/OAI/2.0"xmlns:lido="http://www.lido-schema.org"version="1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:import namespace="http://www.openarchives.org/OAI/2.0" schemaLocation="http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"/>
<xs:import namespace="http://www.lido-schema.org" schemaLocation="http://www.lido-schema.org/schema/v1.0/lido-v1.0.xsd"/>
</xs:schema>
Существует код C ++ для разбора схемы .xsd с использованием libxml2:
bool XmlDocument::validate(const char* fileSchema) {
std::cout << "Starting validate xml-document..";
xmlSchemaParserCtxtPtr schemaParser = xmlSchemaNewParserCtxt(fileSchema);
xmlSchemaPtr schema = xmlSchemaParse(schemaParser);
xmlSchemaValidCtxtPtr schemaValid = xmlSchemaNewValidCtxt(schema);
int result = xmlSchemaValidateDoc(schemaValid, xmlDocument);
if(result!=0) { std::cout << "Error! Code: " << result << std::endl; return false; }
else { std::cout << "Done!\n"; return true; }
return false;
}
И, наконец, список ошибок:
http://www.w3.org/1999/xlink.xsd:27: импорт элемента: Предупреждение анализатора схем: Элемент ‘{http://www.w3.org/2001/XMLSchema} import ‘: пропустить импорт схемы, расположенной в’http://www.w3.org/2001/xml.xsd«для пространства имен»http://www.w3.org/XML/1998/namespace‘, так как это пространство имен уже было импортировано со схемой, расположенной в’http://www.w3.org/2001/03/xml.xsd».
ошибка: операция выполняется
Предупреждение ввода / вывода: не удалось загрузить внешнюю сущность «http://schemas.opengis.net/gml/3.1.1/base/coverage.xsd«
http://schemas.opengis.net/gml/3.1.1/base/gml.xsd:16: element include: Ошибка синтаксического анализатора схем: Элемент ‘{http://www.w3.org/2001/XMLSchema} include ‘: не удалось загрузить документ’http://schemas.opengis.net/gml/3.1.1/base/coverage.xsdдля включения.
ошибка: операция выполняется
Предупреждение ввода / вывода: не удалось загрузить внешнюю сущность «http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd«
response.xml: 3: элемент OAI-PMH: предупреждение о допустимости схем: элемент ‘{http://www.openarchives.org/OAI/2.0/} OAI-PMH ‘, атрибут’ {http://www.w3.org/2001/XMLSchema-instance} schemaLocation ‘: документ в местоположении’http://www.openarchives.org/OAI/2.0/OAI-PMH . xsd ‘не может быть приобретено.
response.xml: 3: элемент OAI-PMH: ошибка достоверности схемы: элемент ‘{http://www.openarchives.org/OAI/2.0/} OAI-PMH ‘: для корня проверки не найдено подходящего глобального объявления.
Пожалуйста, помогите найти ошибку, мне будет очень приятно!
В первом наборе сообщений об ошибках сообщается, что анализатор не может загрузить внешний XSD-файл, указанный в его URL-адресе.
Может ли ящик, на котором вы работаете, иметь доступ к Интернету?
Чтобы иметь возможность импортировать внешний XSD-файл, естественно, должен быть доступ в Интернет.
При отсутствии доступа к Интернету можно вручную загрузить любые необходимые внешние файлы и загрузить их локально через файл каталога xml; но это другая, несколько более сложная тема.