2010-01-17 142 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