2010-01-17 3 views
2

fichier XML GevenValeur par défaut de DTD dans xStream

<?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" /> 

et le code 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); 

Mon navigateur, il rend comme suit:

<ExternalRequestContext requestType="News" deepEnrichment="false" channelMandatory="true" /> 

Notez que channelMandatory = "true " (navigateur traité l'instruction DTD)

tout xStream produit

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

Ici channelMandatory = "false" (xStream ignoré les « channelMandatory (true | false) "true" » instruction DTD)

Que dois-je manquer? Comment "dire" xStream pour traiter les instructions DTD? Et comment puis-je activer la validation DTD dans xStream?

Répondre

1

Cela pourrait être parce que vous .. re en utilisant le type boolean primitive Lorsque la classe ERC est instancié, le champ channelMandatory est initialisé par java à false Puisque le document ne contient aucune donnée pour ce domaine, il reste à false

validation DTD en java est juste que. - Il ne modifie pas le document, il le laisse tel quel, il permet juste s channelMandatory ne pas être présent, sachant qu'il a une valeur par défaut. Si un navigateur choisit de faire autre chose, c'est bien, mais cela va au-delà de la validation.

Vous pouvez essayer la solution de potentiel la plus simple - initialiser le champ channelMandatory à true, par ex.

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

Cela fonctionnerait probablement bien. C'est l'approche que JAXB prend pour générer un modèle d'objet java à partir d'un schéma, je pense.

+0

Très bien! L'utilisation d'une classe wrapper au lieu du type primitif peut indiquer si une valeur a été donnée dans le fichier XML. initialisation explicite, cependant, ne fonctionne pas: je reçois channelMandatory est fausse quelle que soit sa valeur initiale. En ce qui concerne la validation: puis-je faire xStream de lancer une exception si je nourris avec invalides (mais bien formé) XML? – Lopotun