IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Persistance des données Java Discussion :

[JAXB] Problème parsing XML avec XSD validant


Sujet :

Persistance des données Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 56
    Points : 50
    Points
    50
    Par défaut [JAXB] Problème parsing XML avec XSD validant
    Bonjour à tous,

    Voilà je rencontre actuellement un problème lors du parsing d'un fichier xml avec JAXB lorsque je veux associer le fichier XSD correspondant afin de faire la validation.

    Voici un extrait de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                   JAXBContext jc = JAXBContext.newInstance(new Class[] {MyClass.class});
                   Unmarshaller u = jc.createUnmarshaller();
                   
                   InputStream schemaStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("xsd/myXSD.xsd"); 
                   StreamSource schemaSource = new StreamSource(schemaStream);
    
    			   Schema mySchema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(schemaSource);               
                   u.setSchema(mySchema);
                   
                   Object unmarshalledObject = u.unmarshal(new FileInputStream(filename));
    Le xsd associé au fichier xml est 'myXSD.xsd' et se trouve dans un jar externe.

    Mais lorque ce code est exécuté, l'exception suivante est levée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'xsd:myHeader' to a(n) 'type definition' component.
    Cela est dû au fait que le type 'xsd:myHeader' est défini dans un autre fichier XSD. (l'instruction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsd:include schemaLocation="commonTypes.xsd"/>
    se trouve dans myXSD.xsd)

    Je suis tombé sur ce lien décrivant le même problème.

    Une solution est de redéfinir le resource resolver en implémentant l'interface "LSResourceResolver" mais je n'ai aucune idée de comment le faire...

    Auriez-vous un exemple d'implémentation ou une autre solution pour m'aider à résoudre mon problème ?

    Merci d'avance,

    Sébastien

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 56
    Points : 50
    Points
    50
    Par défaut
    Bon je n'ai toujours pas résolu mon problème mais je vais expliqué ce que j'ai tenté :

    SchemaFactory propose la methode suivante : newSchema(Source[] schemas)

    Je me dis euréka - il suffit que je construise un tableau de StreamSource avec les tous les xsd référencés dans les instructions xsd:include.

    Et bien non cela aurait été trop simple...

    Il n'y a cependant plus d'exception levée lors de la création du schéma mais lors de l'invocation de la méthode unmarshal(Document).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'RootElement'
    J'ai fais qques recherches sur google et je suis tombé sur ce lien : Cannot validate against multiple XML schemas within the same namespace

    Il s'agirait d'un bug lors de la construction du schéma avec l'appel newSchema avec comme argument le tableau de StreamSource; Si les XSD ont le même namespace, seulement le premier de la liste est pris en compte car le hashcode est calculé sur base du name space...

    Je suis vraiment bloqué... Personne ne peut vraiment m'aider ? Merci d'avoir pris le temps de me lire

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 56
    Points : 50
    Points
    50
    Par défaut
    Une fois de plus je m'auto-répond...

    Juste pour signaler que j'ai résolu mon problème.

    Pour ceux qui rencontreraient ce problème voici comment je l'ai résolu :

    J'ai utilisé la méthode newSchema(URL) au lieu de newSchema(Source[]) tout simplement ! Les instructions <xsd:include> ne posent ainsi plus de problème.

    Donc au lieu de récupérer un stream avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.currentThread().getContextClassLoader().getResourceAsStream("xsd/myXSD.xsd")
    j'ai récupérer l'URL avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.currentThread().getContextClassLoader().getResource("xsd/myXSD.xsd")

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. C# Validation XML avec XSD
    Par Spotty dans le forum C#
    Réponses: 1
    Dernier message: 11/02/2009, 16h22
  2. [XSD] Valider partiellement XML avec XSD
    Par =FdK= dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/12/2008, 13h51
  3. [WD 12] MSXML - validation xml avec xsd externe
    Par nicol9 dans le forum WinDev
    Réponses: 1
    Dernier message: 29/07/2008, 15h08
  4. [SAX] validation d'un xml avec xsd
    Par salmamah dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 25/04/2008, 17h22
  5. Valider XML avec XSD
    Par neilbgr dans le forum Langage
    Réponses: 10
    Dernier message: 26/03/2008, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo