Обратите внимание, валидация - это нечто иное, чем правильность. Правильное оформление означает синтаксически правильный документ XML.
Срок действия - более узкая вещь: он также требует, чтобы документ соответствовал критериям, определяющим c формат документа.
My исследования показали, что для проверки XML существует два стандарта: DTD и XSD. В то время как DTD принадлежит документу XML, XSD принадлежит тегу XML. Очевидно, что он может быть установлен также для тега root документа XML, например, так:
<?xml version="1.0" encoding="utf-8"?>
<RootTag xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="./example.xsd">
<!-- ... -->
</RootTag>
Logi c будет диктовать, что следующий код C ++, чтение и проверка документа , должно работать:
int main(int argc, char* argv[]) {
try {
xmlpp::DomParser parser;
parser.set_validate();
parser.set_substitute_entities(); //We just want the text to be resolved/unescaped automatically.
parser.parse_file("example.xml");
...
}
catch(const std::exception& ex) {
std::cout << "Exception caught: " << ex.what() << std::endl;
}
return 0;
}
Однако этого не происходит. Код ошибается с
Exception caught:
Validity error:
File example.xml, line 2, column 111 (error):
Validation failed: no DTD found !
Мне кажется, что libxml ++ хочет каким-то образом проверять только DTD. Аналоговый файл XML, но с использованием средства проверки DTD, работает без проблем.
Почему? Могу ли я проверить все документы XML по XSD? Это ограничение libxml2, я что-то упустил в документации по libxml2, или просто это стандарт?
Для проверки документов я бы предпочел XSD, но с проверкой DTD все в порядке, если это стандарт (по какой-то причине).