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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    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
    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
    Membre habitué
    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
    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
    Membre habitué
    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
    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 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    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
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    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 actif Avatar de gloax29
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    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 !

+ 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