xStream中DTD的默认值

时间:2010-01-17 10:36:19

标签: dtd xstream

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 =“true”(浏览器处理了DTD指令)

而xStream产生

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

此处 channelMandatory =“false”(xStream忽略了“channelMandatory(true | false)”true“”DTD指令)

我想念什么?如何“告诉”xStream处理DTD指令? 如何在xStream中启用DTD验证?

1 个答案:

答案 0 :(得分:1)

这可能是因为您使用的是原始boolean类型。实例化类ERC时,channelMandatory字段由java初始化为false。由于该文档不包含该字段的数据,因此它保留在false

java中的DTD验证就是 - 验证。它不会修改文档,它会保留原样,它只允许channelMandatory不存在,因为它知道它有一个默认值。如果网络浏览器选择做其他明智的做法,那很好,但这超出了验证范围。

您可以尝试最简单的潜在解决方案 - 将channelMandatory字段初始化为true,例如

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

这可能会很好。我认为这是JAXB从模式生成java对象模型的方法。