2

给定的 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 验证?

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 回答