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] La balise <![CDATA[]]>


Sujet :

Persistance des données Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut [JAXB] La balise <![CDATA[]]>
    Bonjour,
    dans le cadre de mon stage, je dois utiliser JAXB pour générer des fichiers xml du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <racine>
    	<noeud>
    		<info><![CDATA[truc]]></info>
    	</noeud>
    </racine>
    Il faut donc que toutes mes données soit encadré par des CDATA.

    Or lorsque j'ajoute les CDATA en dur dans le code JAXB remplace les <![CDATA[truc]]> par &lt;![CDATA[truc]]&gt;.

    J'ai vu sur la faq officiel de JAXB le message suivant :
    Q. How can I cause the Marshaller to generate CDATA blocks?

    A. This functionality is not available from JAXB directly, but you can configure an Apache Xerces-J XMLSerializer to produce CDATA blocks. Please review the JaxbCDATASample.java sample app for more detail.
    avec l'exemple ici.

    Or il semblerai que toutes les classes de Xerces nécessaire soit deprecated...

    Du coup impossible de tester. Quelqu'un a t'il déjà eu ce prob? svp

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Voila j'ai fais exactement comme montré dans l'exemple aucun CDATA ne sort.
    Voici mon code :

    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
    private static XMLSerializer getXMLSerializer() {
            // configure an OutputFormat to handle CDATA
            OutputFormat of = new OutputFormat();
     
            // specify which of your elements you want to be handled as CDATA.
            // The use of the '^' between the namespaceURI and the localname
            // seems to be an implementation detail of the xerces code.
            // When processing xml that doesn't use namespaces, simply omit the
            // namespace prefix as shown in the third CDataElement below.
            String[] cdata = new String[] {"^envTrt",
    	    		   "^famille",   
    			   ^identifiant",
    			   };
     
            of.setCDataElements(cdata
    			    );
     
            of.setNonEscapingElements(cdata);
     
            // set any other options you'd like
            of.setIndenting(true);
     
            // create the serializer
            XMLSerializer serializer = new XMLSerializer(of);
     
            return serializer;
        }
    et dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    File temp=File.createTempFile(nom, new File(getConfig().getTmpPath()));
     
    			// get an Apache XMLSerializer configured to generate CDATA
    	        XMLSerializer serializer = getXMLSerializer();
     
    		serializer.setOutputByteStream(new FileOutputStream(temp));
     
    			// marshal using the Apache XMLSerializer
    			marshaller.marshal(doc, serializer.asContentHandler());
    et je souhaiterai obtenir ça :
    (en gros tous les champ dans des CDATA)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
     <ReferentielFlux xsi:schemaLocation="http://www..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.editique...">
    	<Flux fullname="PRD-OPENPAGE:32ER-345E2">
    		<envTrt><![CDATA[PRD]]></envTrt>
    		<famille><![CDATA[OPENPAGE]]></famille>
    		<identifiant><![CDATA[32ER-345E2]]></identifiant>
    	</Flux>
    </ReferentielFlux>
    Mais aucun CDATA Quelqu'un peut m'aider svp? La doc JAXB est-elle fausse?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Ça y est ! J'ai trouvé le problème !
    En fait il ne faut pas oublier de mettre le path URI devant le nom des balises avec '^' entre chaque.
    Ainsi pour obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ReferentielFlux xmlns="http://www.editique.test">
    	<envTrt><![CDATA[PRD]]></envTrt>
    </ReferentielFlux
    Il faut ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String[] cdata = new String[] {"http://www.editique.test^envTrt"};
     
    of.setCDataElements(cdata);
    voila en espérant que cela pourra servir à quelqu'un.
    Et vivement que JAXB intègre la gestion des CDATA

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Merci pour l'astuce, ça pourra servir.

    Citation Envoyé par CaitSith95 Voir le message
    Et vivement que JAXB intègre la gestion des CDATA
    En même temps, les CDATA servent au confort d'écriture, mais ne modifient pas le document. CDATA ou échappement, on est censé n'en avoir rien à f.iche.

    Bon, puisque confort d'écriture, il existe, c'est sympa d'avoir un moyen de s'en servir. Mais pas prioritaire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    quelqu'un connait t'il un moyen de rendre seulement certain balise CDATA

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <Apple>
       <familly>
            <Familly>
                <type><![CDATA[granny]]></type>
            </Familly>
       </familly>
       <flavour>
            <Flavour>
                 <type>acid<type>
           </Flavour>
       </flavour>
    </Apple>

  6. #6
    Membre régulier Avatar de gloax29
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Points : 70
    Points
    70
    Par défaut meme souci mais trouver solution
    sorti :

    &lt;![CDATA[&lt;xxxx&gt;text&lt;/xxxx&gt]];

    creer la class :

    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
     
    public class EscapeHandler implements CharacterEscapeHandler {
     
    	public static final NoEscapeHandler Instance = new NoEscapeHandler();
     
    	private NoEscapeHandler() {
    		super();
    	}
     
    	@Override
    	public void escape(char[] buf, int start, int len, boolean isAttValue, Writer out) throws IOException {
    			for (int i = start; i < start + len; i++) {
    			out.write(buf[i]);
    		}
    		return;
    	}
     
    }
    puis pour le marshaller un set Property :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		CharacterEscapeHandler CharacterEscapeHandler = EscapeHandler.Instance;
    		marshaller.setProperty("com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler", CharacterEscapeHandler ); 
    marshaller.marshal(jaxb , stringWriter  );
    resultat :
    <![CDATA[<xxxx>text</xxxx> ]];


    voila !

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Du coup on se demande l'intérêt de passer par JAXB -_-°.

    La solution de CaitSith95 était bien meilleure et fonctionnait certainement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre régulier Avatar de gloax29
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Points : 70
    Points
    70
    Par défaut
    vue la puissance de JAXB et JAXWS je ne me pose même pas la question et je n'avais pas qu'un seule élément de type CDATA. cdt

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Citation Envoyé par gloax29 Voir le message
    vue la puissance de JAXB et JAXWS je ne me pose même pas la question et je n'avais pas qu'un seule élément de type CDATA. cdt
    ... Je vois pas où est la puissance dans le fait d'être obligé d'écrire "<![CDATA[" et "]]>" dans absolument tous les textes, mais si quelqu'un en voit une, alors oui, je comprends que cette approche soit intéressante.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre régulier Avatar de gloax29
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Points : 70
    Points
    70
    Par défaut
    il semble que cela fait partie de la syntaxe XML, qui lui n'analyse pas ce qu'il y a entre ces balises. et le probleme c'est que le < et > sont interprétés en &lt; et &gt ce qu'il ne faut pas pour cette balise.

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

Discussions similaires

  1. [JAXB] Sérialisation avec JAXB et des éléments CDATA
    Par bernidupont dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 26/03/2013, 18h41
  2. Problème CDATA dans balise XML
    Par charliejo dans le forum Dynamique
    Réponses: 4
    Dernier message: 12/01/2007, 13h04
  3. Réponses: 2
    Dernier message: 14/06/2006, 11h34
  4. xml cdata et balise
    Par chris30 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 18/01/2006, 11h32

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