2011-09-22 8 views
1

Je suit XSD que j'ai utilisé à des objets JAXB générésJAXB analyse syntaxique "minOccours" - un problème unmarshling

<xs:complexType name="packageType"> 
    <xs:sequence> 
     <xs:element ref="package" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element ref="dependencies" minOccurs="0"/> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:NMTOKEN" use="required"/> 
</xs:complexType> 

Si je reçois un XML

  1. pas dépendance tag
  2. vide dépendance étiquette ie

XML Exemple

<package id="FA33" required="false" empty="false"> 
    <dependencies /> 
</package> 

Dans l'exemple ci-dessus, Si je supprime la « dépendances » balise vide, JAXB lancers francs erreur « fin inattendue du paquet ».

Comme le minOccours est là, ces deux scénarios ne devraient pas faire de différence. Mais dans mon cas, JAXB est incapable de démêler le xml donné en case1, c'est-à-dire s'il n'y a pas de balise de dépendance. Si une balise de dépendance vide est là alors ça va bien.

Est-ce que le comportement est attendu ou est-ce que quelque chose ne va pas?

P.S: J'utilise JAXB 1.3

+1

La version 1.3 de l'implémentation de référence JAXB 1 est assez ancienne. Êtes-vous capable de passer à une implémentation de la spécification JAXB 2: Metro, EclipseLink MOXy, Apache JaxMe, etc? –

+0

Vous posez des questions sur la dépendance ici. Dans l'extrait que vous avez posté il y a des "dépendances". Pouvez-vous publier l'extrait avec dépendance? Peut-être que vous manquez quelque chose là-bas. –

+0

La mise à niveau vers la version 2 n'est pas une option pour le moment. c'était une erreur, j'ai corrigé ma question en remplaçant "dépendance" par "dépendances". et un exemple de xml. –

Répondre

3

Comment l'utilisation de JAXB 2?

JAXB 1 utilisé pour valider sur unmarshall. Ce fut un problème puisque vous ne pouviez pas vraiment unmarshall XML non valide avec les éléments obligatoires manquants etc.

Pour autant que je me souviens, je l'habitude de résoudre ce problème par:

  • Enregistrement d'un « ignorant » gestionnaire de validation
  • classes dérivées de schéma génératrices avec une version corrigée de jaxb-xjc

Le gestionnaire est la suivante:

import javax.xml.bind.ValidationEventHandler; 

/** 
* Validation handler which ignores all the validation events. 
*/ 
public class IgnoringValidationEventHandler implements ValidationEventHandler { 

    /** 
    * Static instance. 
    */ 
    public static final ValidationEventHandler INSTANCE = new IgnoringValidationEventHandler(); 

    /** 
    * Simply returns <code>true</code> 
    * 
    * @param event 
    *   ignored; 
    * @return Always returns <code>true</code>. 
    */ 
    public boolean handleEvent(javax.xml.bind.ValidationEvent event) { 
     return true; 
    } 
} 

Enregistrez-le via marshaller.setEventHandler(IgnoringValidationEventHandler.INSTANCE);. En ce qui concerne le jaxb-xjc patché, vous pouvez me contacter via valikov (at) gmx.net, je peux vous envoyer le pot.

+0

le problème est que ce pot JAXB est utilisé à travers le système en nombre de classes. Je ne suis pas sûr, changer un pot affecterait d'autres classes ou pas. Puis-je essayer l'approche du gestionnaire sans modifier le pot donné? –

+0

Eh bien, vous pouvez essayer, mais cela échouera toujours dans de nombreux cas - par exemple avec des éléments et des attributs obligatoires.Vous devriez changer le JAR 'jaxb-xjc' qui génère les classes (le' jaxb-impl' de l'exécution n'a pas besoin d'être changé). Le problème est que "échouer si l'élément ou l'attribut obligatoire est manquant" est câblé dans le code généré qui est quelque peu basé sur un automate fini. Quand une transition échoue, l'analyse ne peut simplement pas continuer. Si je me souviens, j'ai piraté 'jaxb-xjc' pour produire un automate plus laxiste. – lexicore