2010-01-17 187 views
2

Geven XML文件默認值

<?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 =「真「(瀏覽器處理了DTD指令)

而XSTREAM產生

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

這裏channelMandatory = 「假」(西河忽略了「channelMandatory(真| FALSE)「真」」 DTD指令)

我怎麼錯過?如何‘告訴’西河處理DTD說明? ,如何使DTD驗證在西河?

回答

1

這可能是因爲你」 。重新使用原始boolean類型當類ERC被實例化,channelMandatory場由java的初始化爲false由於文檔包含該字段的數據,它停留在false在Java

DTD驗證了這一點。 - 它不修改文檔,它保持原樣,只是允許s channelMandatory知道它不存在,知道它有一個默認值。如果網絡瀏覽器選擇其他方式,那很好,但這不僅僅是驗證。

您可以嘗試最簡單的潛在解決方案 - 將channelMandatory字段初始化爲true,例如,

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

這可能會正常工作。我認爲,這是JAXB從模式生成Java對象模型所採用的方法。

+0

好!使用包裝類而不是基元類型可以指示是否在XML文件中給出了值。 然而,顯式初始化不起作用:無論其初始值如何,我都會得到channelMandatory爲false。 關於驗證:我可以讓xStream拋出一個異常,如果我用無效的(但格式良好的)XML提供它嗎? – Lopotun 2010-01-17 12:50:10