Libxml2 不会使用 XSD 验证文档,仅使用 DTD。为什么?标准怎么说?

Libxml2 won't validate a document with XSD, only with DTD. Why? What do the standards say?

请注意,验证与格式良好不同。格式良好意味着语法正确 XML 文档。

有效性是一个更窄的东西:它还要求文档通过特定于文档格式的标准。

我的研究表明 XML 验证有两个标准:DTD 和 XSD。 DTD 属于 XML 文档,而 XSD 属于 XML 标签。显然,它也可以设置在 XML 文档的根标签上,像这样:

<?xml version="1.0" encoding="utf-8"?>
<RootTag xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="./example.xsd">
   <!-- ... -->
</RootTag>

从逻辑上讲,读取和验证文档的以下 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 验证器,工作没有任何问题。

为什么?我可以通过 XSD 验证整个 XML 文档吗?这是 libxml2 的限制,我在 libxml2 文档中遗漏了一些东西,或者只是标准?

对于验证文档,我更喜欢 XSD,但 DTD 验证也可以,如果这是标准的话(出于某种原因)。

为了使用架构 (XSD) 进行验证,您需要准备一个 xmlpp::XsdValidator 对象并使用它来验证您的 XML.

验证器准备示例:

xmlpp::DomParser schema;
schema.parse_file("example.xsd");

xmlpp::XsdValidator validator;
validator.parse_document( schema.get_document() );

验证器的用法示例:

try {
  xmlpp::DomParser parser;
  parser.parse_file("example.xml");
  validator.validate( parser.get_document() );
  // Use the validated XML...
}

catch(const xmlpp::exception &e) {
  std::cerr << "Went wrong: " << e.what() << std::endl;
}