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

Valider XML Discussion :

[XSD] inclusion schéma sans regénération


Sujet :

Valider XML

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [XSD] inclusion schéma sans regénération
    Bonjour à tous,

    Je suis nouveau dans le monde des schémas xsd et je suis actuellement
    confronté à un problème.

    J'ai deux schémas xsd. Et j'utilises jaxb pour générer mes classes java et
    ant pour automatiser le tout.

    Voici le premier (schema1.xsd)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <xsd:element name="jaxbSchema1" type="jaxbSchema1Type"/>
          <xsd:complexType name="jaxbSchema1Type">
                 <xsd:all>
                        <xsd:element name="element1" type="elementType1"
    minOccurs="0" maxOccurs="1"/>
                        <xsd:element name="element2" type="elementType2"
    minOccurs="0" maxOccurs="1"/>
                 </xsd:all>
                 <xsd:attribute name="targetType" type="xsd:string" />
          </xsd:complexType>
          <xsd:complexType name="elementType1">
                 <xsd:attribute name="longName1" type="xsd:long"
    use="required" />
                 <xsd:attribute name="longName2" type="xsd:long"
    use="required" />
                 <xsd:attribute name="longName3" type="xsd:long"/>
          </xsd:complexType>
          <xsd:complexType name="elementType2">
                 <xsd:attribute name="stringName1" type="xsd:string"/>
                 <xsd:attribute name="stringName1" type="xsd:string"/>
                 <xsd:attribute name="stringName1" type="xsd:string"/>
          </xsd:complexType>
    </xsd:schema>
    j'ai positionné une propriété (jaxb.package.name) qui lorsque j'utilise
    jaxb me crée mes classes java dans le package que j'ai défini.

    Et voici le deuxième (schema2.xsd)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <xsd:include schemaLocation="C:/.../schema1.xsd"/>
         <xsd:element name="element" type="elementType"/>
         <xsd:complexType name="elementType">
               <xsd:sequence>
                     <xsd:element name="complexElement" type="jaxbSchema1Type"
    minOccurs="0" maxOccurs="unbounded"/>
                     ... (d'autres élements mais pas pertinent pour mon pb)
               </xsd:sequence>
         </xsd:complexType>
         ....
    </xsd:schema>
    Là aussi j'ai défini la propriété jaxb.package.name (package1) pour qu'il
    me crée mes classes dans un package (différent de celui du schema1.xsd)

    Dans le 2ème schéma je fais appel au premier avec l'élément include.

    J'ai essayé de mettre un chemin absolue (C:/..../schema1.xsd) mais j'ai
    cette erreur lors de la génération des classes java:

    [xjc] [ERROR] Unable to parse "C:/../..schema1"

    J'ai aussi essayé un chemin relatif car schema1.xsd est dans un jar qui est dans mon classpath mais là aussi erreur:

    [xjc] [WARNING] src-include.0: Failed to read included schema document
    'chemin_relatif/schema1.xsd'.
    [xjc] line 2 of schema2.xsd

    [xjc] [ERROR] src-resolve: Cannot resolve the name 'jaxbSchema1Type' to a(n) type definition component.
    [xjc] line 6 of schema2.xsd


    La seule façon que cela fonctionne est de mettre les deux schemas dans le même répertoire et que le schemaLocation de l'élément include de
    schema2.xsd est cette valeur:
    schemaLocation="schema1.xsd"

    Comment faire pour lui donner un chemin relatif ?

    Voici la façon dont je génére mes classes:
    Je lance ant pour qu'il me génere mes classes jaxb java correspondant au schema1.xsd Tout se fait correctement et j'ai mon arborescence de classes dans le package que je lui ai spécifié.
    ex: package1 (répertoire)
    impl (répertoire)
    JaxbSchema1Impl$Unmarshaller.class
    JaxbSchema1Impl.class
    JaxbSchema1TypeImpl$Unmarshaller.class
    JaxbSchema1TypeImpl.class
    ElementType1Impl$Unmarshaller.class
    ElementType1Impl.class
    ElementType2Impl$Unmarshaller.class
    ElementType2Impl.class
    JaxbSchema1.class (interface)
    JaxbSchema1Type.class (interface)
    ElementType1.class (interface)
    ElementType2.class (interface)
    ObjectFactory.class


    de même pour le schema2.xsd sauf qu'il me regénère toutes les classes jaxb java correspondant au schema1.xsd et tout ça dans le package défini pour le schema2.xsd

    J'aimerai que seules les classes du schema2.xsd soient générées et qu'elles utilisent les classes du schema1.xsd. Comment faire ?

    merci de votre aide

    Nicoch

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    le problème n'a a priori rien à voir avec le contenu de tes schémas, il s'agit d'un "simple" problème d'accessibilité. Le validateur de schéma (Xerces, je présume), quand il exécute le <xsd:include>, a besoin d'accéder directement au fichier schema1.xsd, et il ne peut pas le faire si celui-ci se trouve dans un Jar. Je suis assez étonné que JAXB ne gère pas mieux ce genre de cas, mais je ne suis pas très familier avec cette techno.

    La façon la plus simple à mon avis de t'en sortir est de modifier ton script ANT et de lui demander d'extraire puis de copier schema1.xsd dans le même dossier que schema2.xsd, de générer ton deuxième package puis de faire le nettoyage.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    slt GrandFather,

    Merci pour ta réponse. Je vais essayer de modifier ant pour extraire le fichier sauf que je ne comprends pas pourquoi, en mettant le chemin absolue de schema1.xsd dans sxd:include du schema2.xsd j'obtiens une erreur. Il n'arrive pas à parser le fichier.
    Comment faut il faire ? Doit on tjs mettre les deux schémas dans le même répertoire ?

    et j'ai trouvé un article qui parle peut-être de mon problème:
    http://java.sun.com/webservices/jaxb/extendingJaxbGeneratedClasses.html

    je vais creuser ça.

    Nico

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par nicoch
    Il n'arrive pas à parser le fichier.
    Comment faut il faire ? Doit on tjs mettre les deux schémas dans le même répertoire ?
    Il ne parse pas le fichier parce qu'il ne le trouve pas. Si ton schéma est bien disponible en dehors du Jar, et qu'il ne le trouve pas, c'est peut-être tout simplement un problème d'URL. Essaie avec ce format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsd:include schemaLocation="file:///C:/le_chemin_vers_ton_schema/schema1.xsd"/>

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci bp ça marche avec un chemin absolu.
    Maintenant il faut que je trouve comment lui dire de ne pas regénérer les classes java correspondant au schema1.xsd

    J'ai essayé ça:

    <xsd:complexType name="jaxbSchema1Type">
    <jxb:class implClass="package1..JaxbSchema1TypeImpl"/>
    </xsd:complexType>

    dans schema2.xsd

    mais il me dit ça:

    [xjc] [ERROR] sch-props-correct.2: a schema cannot contain two global components with the same name; this one contains two occurrences of ',jaxbSchema1Type'.

Discussions similaires

  1. [XSD] Inclusion d'un schéma dans un autre
    Par ploxien dans le forum Valider
    Réponses: 1
    Dernier message: 20/09/2006, 18h24
  2. Inclusion de sous-rapport sans référence externe
    Par le--handballeur dans le forum iReport
    Réponses: 6
    Dernier message: 02/08/2006, 18h26
  3. [XSD] [XML Schema]Validation sans mettre le xsd dans le xml
    Par sikapoch dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 07/06/2006, 14h23
  4. Inclusion de page en html sans iframe
    Par glsn dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 06/01/2006, 14h37
  5. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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