Xerces dtd验证不起作用

时间:2013-02-07 18:20:44

标签: xml dtd xerces

我有一个DTD数据,我想用它进行XML验证。 这是外部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 ,它总是会失败并显示上述文件,输出“找不到元素'user'的声明”。 如果我在xml文件的标题中设置DTD,如下所示:&lt; !DOCTYPE root SYSTEM“users.dtd”&gt;它运作得很好。当然,我不能在现实世界中使用它,因为我需要在内存中(我从网络获取信息)。 我甚至可以取消整个 loadGrammar 行,不会改变结果。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

行。似乎DTD与Xerces的表现不太好。 但是,移动xsd(更好的格式)并使用catch 解决了这个问题。