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;
}
请注意,验证与格式良好不同。格式良好意味着语法正确 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;
}