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に切り替えると、上記のファイルで常に失敗し、「要素'user'の宣言が見つかりません」と出力されます。次のようにxmlファイルのヘッダーにDTDを設定している場合:<!DOCTYPE rootSYSTEM"users.dtd">正常に機能しています。もちろん、これは現実の世界では使用できません。メモリに両方が必要なためです(ネットワークから情報を取得しています)。loadGrammar行全体をキャンセルすることもできますが、結果は変更されません。
何か案は?