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

Format d'échange (XML, JSON...) Java Discussion :

Comment parser un XSD contenant un "import" ?


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 167
    Par défaut Comment parser un XSD contenant un "import" ?
    Bonjour,

    J'ai ces deux fichiers 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
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://xml.netbeans.org/schema/create02"
        xmlns:tns="http://xml.netbeans.org/schema/create02"
        elementFormDefault="qualified">
        <xsd:element name="elements" type="tns:attributes"/>
        <xsd:complexType name="attributes">
            <xsd:sequence>
                <xsd:element name="objectClass" maxOccurs="unbounded" type="xsd:string"/>
                <xsd:element name="cn" maxOccurs="unbounded"/>
                <xsd:element name="sn"/>
                <xsd:element name="displayName" minOccurs="0"/>
                <xsd:element name="givenName" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="initials" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="mail" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="uid" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="userPassword" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:schema>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://xml.netbeans.org/schema/create01"
        xmlns:tns="http://xml.netbeans.org/schema/create01"
        elementFormDefault="qualified">
        <xsd:include schemaLocation="/chemin_complet/create02.xsd" />
        <xsd:complexType name="attributes">
            <xsd:sequence>
                <xsd:element name="objectClass" maxOccurs="unbounded" type="xsd:string"/>
                <xsd:element name="ou" type="xsd:string"/>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:element name="elements" type="tns:attributes"/>
    </xsd:schema>
    J'utilise ce code Java pour parser le XSD et récuperer le nom des éléments qu'il contient :

    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
    25
    26
    27
    28
    29
    public void test(String xsd) {
     
            try {
                // open the XSD file
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
     
                Document doc = builder.parse(new File(xsd));
     
                // Get the "sequence" node
                Element racine = doc.getDocumentElement();
                NodeList list = racine.getElementsByTagName("xsd:complexType");
     
                // Get all "element" nodes
                for (int k=0 ; k<list.getLength() ; k++) {
                    Element nRac = (Element)list.item(k);
                    NodeList nList = nRac.getElementsByTagName("xsd:element");
     
                    // Get element name if "minOccurs" > 0
                    for (int i=0 ; i<nList.getLength() ; i++) {
                        Element e = (Element)nList.item(i);
                            System.out.println("nom: " + e.getAttribute("name"));
                    }
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    Lorsque je passe le fichier create01.xsd à ma méthode, celle ci ne m'affiche que les éléments du fichier "create01.xsd".

    Or "create01.xsd" contenant un import du fichier "create02.xsd", j'aurais voulu que ma méthode m'affiche les éléments de "create01.xsd" ET "create02.xsd".

    Comment puis-je faire celà ? c'est à dire, comment faire pour que ma méthode aille parser les XSD importés ?

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 167
    Par défaut
    Bon ben en fait c'est bon.
    J'ai rajouté du code qui vérifie si mon XSD contient la balise "<include", et si c'est le cas, je récupère la valeur de l'attribut "schemaLocation" et je parse le XSD pointé.

  3. #3
    Membre chevronné
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Par défaut
    Bonjour,

    Si tu veux utiliser les imports avec XSD il serait mieux d'avoir un seul fichier dans lequel tu utilises tous les XSD de ton schema:

    Par exemple:

    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
    25
    26
    
    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://www.mydomain.org" 
      xmlns="http://www.mydomain.org" 
      elementFormDefault="qualified">
    
      <xsd:include schemaLocation="Generic/gerenic01.xsd"/>
      
      <xsd:include schemaLocation="Data00/data00_GenericType.xsd"/>
      <xsd:include schemaLocation="Data00/data00_EnumType.xsd"/>
    
      <xsd:include schemaLocation="Data01/data01_Abstract.xsd"/>
      <xsd:include schemaLocation="Data01/data01_Curve.xsd"/>
      <xsd:include schemaLocation="Data01/data01_Spot.xsd"/>
    
      <xsd:include schemaLocation="Data02/data02_Requests.xsd"/>
      <xsd:include schemaLocation="Data02/data02_Responses.xsd"/>
      
      <xsd:include schemaLocation="Data03/data03_Instruments.xsd"/>
      <xsd:include schemaLocation="Data03/data03_Rules.xsd"/>
    
    </xsd:schema>
    
    
    Et dans ton programme Java tu utilises ce fichier XSD pour le parsing

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 167
    Par défaut
    Effectivement, c'est une approche intéressante.

    ça pourrait m'éviter la récursivité au niveau de mon parseur, puisqu'un XSD peut conenir des imports, qui eux-mêmes peuvent contenir des imports...

    De plus l'architecture des structures de données serait beaucoup plus claire.

    Merci

Discussions similaires

  1. [XSD] Construire un XML correspondant à un XSD contenant un "import"
    Par RudyWI dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 03/08/2009, 11h59
  2. [XML] Comment parser ?
    Par GLDavid dans le forum Modules
    Réponses: 7
    Dernier message: 03/03/2005, 02h59
  3. Comment afficher un Bitmap contenant une couche alpha ?
    Par pwozniak dans le forum Composants VCL
    Réponses: 9
    Dernier message: 17/01/2005, 19h55

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