Значение по умолчанию из DTD в xStream - PullRequest
2 голосов
/ 17 января 2010

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 игнорировал инструкцию DTD "channelMandatory (true | false)" true "")

Что мне не хватает? Как «сказать» xStream обрабатывать инструкции DTD? И как мне включить проверку DTD в xStream?

1 Ответ

1 голос
/ 17 января 2010

Это может быть потому, что вы используете примитивный тип boolean. Когда создается экземпляр класса ERC, поле channelMandatory инициализируется Java для false. Поскольку документ не содержит данных для этого поля, он остается на false.

Проверка DTD в Java - это всего лишь проверка. Он не изменяет документ, он оставляет его как есть, он просто позволяет channelMandatory отсутствовать, зная, что он имеет значение по умолчанию. Если веб-браузер выбирает другие способы, это нормально, но это выходит за рамки проверки.

Вы можете попробовать самое простое потенциальное решение - инициализировать поле channelMandatory в true, например,

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

Это, вероятно, будет работать нормально. Я полагаю, что именно такой подход JAXB использует для создания объектной модели Java из схемы.

...