Libxml2 не будет проверять документ с XSD, только с DTD. Почему? Что говорят стандарты? - PullRequest
0 голосов
/ 15 февраля 2020

Обратите внимание, валидация - это нечто иное, чем правильность. Правильное оформление означает синтаксически правильный документ 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 все в порядке, если это стандарт (по какой-то причине).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...