2

GevenXMLファイル

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ExternalRequestContext [
<!ELEMENT ExternalRequestContext EMPTY>
<!ATTLIST ExternalRequestContext
 requestType CDATA #REQUIRED
 deepEnrichment (true | false) "false"
 channelMandatory (true | false) "true">
]
>

<ExternalRequestContext requestType="News" deepEnrichment="false" />

そしてxStreamコード

@XStreamAlias("ExternalRequestContext")
class ERC {
 private String requestType;
 private boolean deepEnrichment;
 private boolean channelMandatory;
}
...
XStream x = new XStream();
x.processAnnotations(ERC.class);
ERC erc = (ERC)x.fromXML(new FileReader("C:/Projects/Forwarder/Test.xml"));
x.toXML(erc, System.out);

私のブラウザはそれを次のようにレンダリングします:

<ExternalRequestContext requestType="News" deepEnrichment="false" channelMandatory="true" />

channelMandatory = "true"(ブラウザーがDTD命令を処理した)に注意してください

xStreamが生成する間

<ExternalRequestContext>
  <deepEnrichment>false</deepEnrichment>
  <channelMandatory>false</channelMandatory>
</ExternalRequestContext>

ここでchannelMandatory="false"(xStreamは "channelMandatory(true | false)" true "" DTD命令を無視しました)

何が恋しいですか?xStreamにDTD命令を処理するように「指示」する方法は?また、xStreamでDTD検証を有効にするにはどうすればよいですか?

4

1 に答える 1

1

これは、プリミティブboolean型を使用していることが原因である可能性があります。クラスERCがインスタンス化されると、channelMandatoryフィールドはjavaによって。に初期化されfalseます。ドキュメントにはそのフィールドのデータが含まれていないため、にとどまりますfalse

JavaでのDTD検証は、まさにそれです-検証。ドキュメントを変更せず、channelMandatoryそのままにします。デフォルト値があることを認識して、存在しないことを許可します。Webブラウザーが他の方法を選択した場合、それは問題ありませんが、それは検証を超えています。

最も単純な解決策を試すことができます-channelMandatoryフィールドを次のようtrueに初期化します。

@XStreamAlias("ExternalRequestContext")
class ERC {
 private String requestType;
 private boolean deepEnrichment = false;
 private boolean channelMandatory = true;
}

それはおそらくうまくいくでしょう。これは、JAXBがスキーマからJavaオブジェクトモデルを生成するために採用しているアプローチだと思います。

于 2010-01-17T10:58:04.277 に答える