Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > XML
XML Forum API et protocoles XML en Java. Avant de poster -> FAQ Java/XML, FAQ XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/10/2011, 10h30   #1
littlesquall
Invité de passage
 
Inscription : mars 2005
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 10
Points : 0
Points : 0
Par défaut Utiliser valeur par défaut du XSD pour les éléments facultatifs

Bonjour à tous,

Je travaille avec un parser Java (org.apache.xerces.parsers.SAXParser) et j'essaie de transformer les données d'un XML dans un format texte en utilisant une validation XSD pour récupérer des valeurs par défaut.

Exemple de fichier XSD :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="donnees" type="MesDonnees"/>
  <xsd:complexType name="MesDonnees">
    <xsd:all>
      <xsd:element name="object" type="MonObject" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:all>
  </xsd:complexType>
 
  <xsd:complexType name="MonObject">
    <xsd:sequence>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="tata" type="xsd:string" minOccurs="1"/>
            <xsd:element name="toto" type="xsd:string" minOccurs="0" default="toto"/>
            <xsd:element name="tutu" type="xsd:string" minOccurs="1"/>
          </xsd:sequence>
        </xsd:complexType>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

Exemple de fichier XML :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0"?>
<donnees>
  <object>
    <tata>tata1</tata>
    <toto>toto1</toto>
    <tutu>tutu1</tutu>
  </object>
  <object>
    <tata>tata2</tata>
    <toto>toto2</toto> <!-- ******** valeur non renseignée ou pas de balises ********-->
    <tutu>tutu2</tutu>
  </object>
  <object>
    <tata>tata3</tata>
    <toto>toto3</toto>
    <tutu>tutu3</tutu>
  </object>
</donnees>

Je souhaite convertir mon XML dans un fichier texte au format suivant :
Code :
1
2
3
tata1:toto1:tutu1
tata2:toto2:tutu2
tata3:toto3:tutu3
Le soucis est que parfois, il est possible que dans mon XML, je ne reçoive pas d'élément <toto> (pas de balise ouvrante/fermante).
Lorsque mon SAXParser, parse le XML, au 2ème bloc <object>, il ne trouve pas le champ <toto>
Visiblement, cela ne le dérange pas car il va me chercher l'élément <toto> du 3ème object.

ce qui donne un résultat incorrect :
Code :
1
2
tata1:toto1:tutu1
tata2:toto3:tutu2
alors que je souhaiterai :
Code :
1
2
3
tata1:toto1:tutu1
tata2:toto:tutu2
tata3:toto3:tutu3
Ce que je souhaiterai c'est que dans les 2 cas où <toto> est vide ou null (pas de balise), récupérer la valeur par défaut définie dans le xsd.

J'ai essayé de regarder au niveau du SAXParser mais je ne pense pas que cela soit possible.
Auriez-vous un avis peut être ?
Modification du XSD via XSL, pré-traitement Java...

Merci d'avance
littlesquall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 16h49   #2
tsuji
Membre chevronné
 
Inscription : octobre 2011
Messages : 412
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 412
Points : 677
Points : 677
[0] Ce modèle de contenu est incorrect.
Citation:
<xsd:complexType name="MesDonnees">
<xsd:all>
<xsd:element name="object" type="MonObject" minOccurs="1" maxOccurs="unbounded"/>
</xsd:all>
Pourquoi ne pas utiliser simplement xsd:séquence?
Code :
1
2
3
4
5
  <xsd:complexType name="MesDonnees">
    <xsd:sequence>
      <xsd:element name="object" type="MonObject" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
[1] Ceci non plus. J'ai mis les erreurs hors du contexte entre <!-- et -->.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  <xsd:complexType name="MonObject">
    <xsd:sequence>
        <!--
        <xsd:complexType>
          <xsd:sequence>
        -->
            <xsd:element name="tata" type="xsd:string" minOccurs="1"/>
            <xsd:element name="toto" type="xsd:string" minOccurs="0" default="toto"/>
            <xsd:element name="tutu" type="xsd:string" minOccurs="1"/>
        <!--
          </xsd:sequence>
        </xsd:complexType>
        -->
    </xsd:sequence>
  </xsd:complexType>
tsuji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 18h05   #3
-gma-
Membre éclairé
 
Homme
Inscription : avril 2011
Messages : 209
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2011
Messages : 209
Points : 336
Points : 336
Citation:
Envoyé par littlesquall Voir le message
Auriez-vous un avis peut être ?
Utiliser Jaxb (en bonus ça peut aider à valider le XSD )

Mais attention, ça n'est pas un parser SAX mais DOM, donc ce n'est pas forcément un changement anodin.
-gma- est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h47.


 
 
 
 
Partenaires

Hébergement Web