我有一个要进行 XML 验证的 DTD 数据。这是外部DTD:
<!-- root element. must be there, must contain only one users element -->
<!ELEMENT root (users)>
<!-- users element contains user elements, one or more but can't have no elements-->
<!ELEMENT users (user)+>
<!--user element will include simple text only, no sub elements -->
<!ELEMENT user (#PCDATA)>
这是 users.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<users>
<user>some data</user>
<user>some data</user>
<user>some data</user>
</users>
</root>
创建解析器后,这是我要验证的内容:
Grammar* g= parser->loadGrammar("users.dtd",Grammar::DTDGrammarType,false);
parser->setValidationScheme(XercesDOMParser::Val_Auto);
现在,如果我使用Val_Auto任何事情都会发生。没有任何验证,我正在使用不同的文件,它没有捕获任何东西。如果我切换到Val_Always,它总是会因上述文件而失败,输出“没有为元素'用户'找到声明”。如果我在 xml 文件的标头中设置 DTD,如下所示: < !DOCTYPE root SYSTEM "users.dtd" > 它工作得很好。当然,我不能在现实世界中使用它,因为我需要在内存中(我从网络获取信息)。我什至可以取消整个loadGrammar行,不会改变结果。
有任何想法吗?