Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité régulier
    Inscrit en
    février 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : février 2010
    Messages : 8
    Points : 5
    Points
    5

    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 :
    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
    Invité régulier
    Inscrit en
    février 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : février 2010
    Messages : 8
    Points : 5
    Points
    5

    Par défaut

    Voila j'ai fais exactement comme montré dans l'exemple aucun CDATA ne sort.
    Voici mon code :

    Code :
    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 :
    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 :
    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
    Invité régulier
    Inscrit en
    février 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : février 2010
    Messages : 8
    Points : 5
    Points
    5

    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 :
    1
    2
    3
    <ReferentielFlux xmlns="http://www.editique.test">
    	<envTrt><![CDATA[PRD]]></envTrt>
    </ReferentielFlux
    Il faut ecrire :

    Code :
    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

    Inscrit en
    septembre 2004
    Messages
    9 541
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 541
    Points : 14 377
    Points
    14 377

    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.

  5. #5
    Invité de passage
    Inscrit en
    décembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : décembre 2005
    Messages : 5
    Points : 1
    Points
    1

    Par défaut

    quelqu'un connait t'il un moyen de rendre seulement certain balise CDATA

    exemple :
    Code :
    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
    Nouveau Membre du Club
    Homme Profil pro joel Gloaguen
    Développeur informatique
    Inscrit en
    juin 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Nom : Homme joel Gloaguen
    Âge : 41
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : juin 2002
    Messages : 32
    Points : 28
    Points
    28

    Par défaut meme souci mais trouver solution

    sorti :

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

    creer la class :

    Code :
    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 :
    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

    Inscrit en
    septembre 2004
    Messages
    9 541
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 541
    Points : 14 377
    Points
    14 377

    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.

  8. #8
    Nouveau Membre du Club
    Homme Profil pro joel Gloaguen
    Développeur informatique
    Inscrit en
    juin 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Nom : Homme joel Gloaguen
    Âge : 41
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : juin 2002
    Messages : 32
    Points : 28
    Points
    28

    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

    Inscrit en
    septembre 2004
    Messages
    9 541
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 541
    Points : 14 377
    Points
    14 377

    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.

  10. #10
    Nouveau Membre du Club
    Homme Profil pro joel Gloaguen
    Développeur informatique
    Inscrit en
    juin 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Nom : Homme joel Gloaguen
    Âge : 41
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : juin 2002
    Messages : 32
    Points : 28
    Points
    28

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •