0

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行全体をキャンセルすることもできますが、結果は変更されません。

何か案は?

4

1 に答える 1

0

わかった。DTDはXercesでうまく機能していないようです。ただし、xsd(はるかに優れた形式)を移動してcatchを使用すると、この問題は解決しました。

于 2013-02-10T11:06:47.567 に答える