JAXB de Triage Unmarshalling avec CDATA
je suis en train de faire le marshaling avec JAXB.
ma sortie, c'est comme
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<name><![CDATA[<h1>kshitij</h1>]]></name>
<surname><h1>solanki</h1></surname>
<id><h1>1</h1></id>
</root>
mais j'ai besoin de sortie comme
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<name><![CDATA[<h1>kshitij</h1>]]></name>
<surname><![CDATA[<h1>solanki</h1>]]></surname>
<id><![CDATA[0]]></id>
</root>
Je suis à l'aide de code suivant pour ce faire. et si je dé-commenter le code je obtenir la Propriété de Liaison Exception. Sans elle, je peux compiler, mais je ne suis pas exactement de sortie requis.
package com.ksh.templates;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import com.sun.xml.bind.marshaller.CharacterEscapeHandler;
public class MainCDATA {
public static void main(String args[])
{
try
{
String name = "<h1>kshitij</h1>";
String surname = "<h1>solanki</h1>";
String id = "<h1>1</h1>";
TestingCDATA cdata = new TestingCDATA();
cdata.setId(id);
cdata.setName(name);
cdata.setSurname(surname);
JAXBContext jaxbContext = JAXBContext.newInstance(TestingCDATA.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
public void escape(char[] ac, int i, int j, boolean flag,
Writer writer) throws IOException {
writer.write( ac, i, j ); }
});
StringWriter stringWriter = new StringWriter();
marshaller.marshal(cdata, stringWriter);
System.out.println(stringWriter.toString());
}
catch (Exception e)
{
System.out.println(e);
}
}
}
et mon haricot lokks comme
package com.ksh.templates;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import com.sun.xml.txw2.annotation.XmlCDATA;
@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestingCDATA {
@XmlElement
@XmlJavaTypeAdapter(value = AdaptorCDATA.class)
private String name;
@XmlElement
@XmlJavaTypeAdapter(value = AdaptorCDATA.class)
private String surname;
@XmlCDATA
public String getName() {
return name;
}
@XmlCDATA
public void setName(String name) {
this.name = name;
}
@XmlCDATA
public String getSurname() {
return surname;
}
@XmlCDATA
public void setSurname(String surname) {
this.surname = surname;
}
}
Adaptateur Classe
public class AdaptorCDATA extends XmlAdapter<String, String> {
@Override
public String marshal(String arg0) throws Exception {
return "<![CDATA[" + arg0 + "]]>";
}
@Override
public String unmarshal(String arg0) throws Exception {
return arg0;
}
}
Vous devez vous connecter pour publier un commentaire.
Vous pouvez effectuer les opérations suivantes:
AdapterCDATA
Racine
La
@XmlJavaTypeAdapter
annotation est utilisée pour indiquer que laXmlAdapter
doit être utilisé.Démo
J'ai dû l'envelopper
System.out
dans unOutputStreamWriter
pour obtenir l'effet désiré. Notez également que l'établissement d'unCharacterEscapeHandler
signifie qu'il est responsable de tous échapper à la manipulation pour queMarshaller
.d'entrée.xml/Sortie
CharacterEscapeHandler
instruction import pour êtreimport com.sun.xml.internal.bind.marshaller.*
CharacterEscapeHandler
importation decom.sun.xml.internal.bind.marshaller.*
qui peuvent ou peuvent ne pas être autorisés dans votre environnement.jaxb-impl.jar
à votre chemin de classe. Si vous utilisez le JDK 1.6 télécharger un 2.1 mise en œuvre et, si vous utilisez le JDK 1.7 obtenir le 2.2 impl.Veuillez Noter: je suis le EclipseLink JAXB (MOXy) plomb et un membre de la JAXB (JSR-222) groupe d'experts.
Si vous utilisez MOXy que votre JAXB (JSR-222) fournisseur alors vous pouvez tirer profit de la
@XmlCDATA
extension pour votre cas d'utilisation.Racine
La
@XmlCDATA
annotation est utilisée pour indiquer que vous souhaitez que le contenu d'un champ/bien enveloppé dans une section CDATA. Le@XmlCDATA
annotation peut être utilisée en combinaison avec@XmlElement
.jaxb.propriétés
À utiliser MOXy que votre JAXB fournisseur, vous devez ajouter un fichier nommé
jaxb.properties
avec l'entrée suivante.Démo
Ci-dessous quelques le code de démonstration pour prouver que tout fonctionne.
d'entrée.xml/Sortie
Ci-dessous est l'entrée et la sortie de l'exécution de la démo de code.
Pour Plus D'Informations
internal
comme dans votre exemple de code ou sansinternal
que par la trace de la pile?try
bloc (avec ports)?internal
comme partie du nom de package?internal
dans le cadre decom.sun.xml.bind
dans la trace de la pile?Désolé pour creuser cette question, et de poster une nouvelle réponse (mon rep n'est pas assez élevé encore de commentaire...).
J'ai rencontré le même problème, j'ai essayé de Blaise Doughan réponse, mais à partir de mes tests, soit elle ne couvre pas tous les cas, soit je suis en train de faire quelque chose de mal, quelque part.
De mes tests, ce code supprime tous échapper, peu importe si vous utilisez l'
@XmlJavaTypeAdapter(AdapterCDATA.class)
annotation sur votre attribut...Pour remédier à ce problème, j'ai mis en application les
CharacterEscapeHandler
:Si votre encodage n'est pas de l'UTF*, vous ne voulez pas appeler MinimumEscapeHandler mais plutôt NioEscapeHandler ou même DumbEscapeHandler.
com.soleil.interne ne fonctionne avec play2,mais cela fonctionne
String
contenant un'>'
caractère. D'abord, il sera converti correctement à">"
par le marshaller. Ensuite, vous aurez remplacé par un'>'
, brisant le xml.J'ai atterri sur cette page, en essayant de trouver la solution à un problème similaire, j'ai trouvé une autre approche pour résoudre ce problème.
Une façon de résoudre ce problème est d'envoyer un document XML comme SAX2 événements à un gestionnaire, puis écrire la logique dans le gestionnaire d'ajouter la CDATA balises XML. Cette approche ne nécessite pas d'annotation d'être ajouté. Utile dans le cas où les classes pour être exploitées de sont générés à partir d'un XSD.
Supposons que vous avez une Chaîne de caractères dans une classe générée à partir de XSD qui est d'être recueillis et le champ de Chaîne contient des caractères spéciaux qui sont à mettre à l'intérieur d'une balise CDATA.
Nous allons commencer par la recherche d'un convenable de classe dont la méthode peut être redéfinie dans notre gestionnaire de contenu. Une telle classe est XMLWriter trouvé dans le paquet com.soleil.xml.txw2.de sortie, Il est disponible dans le jdk 1.7 et 1.8
Nous priment sur les caractères de la méthode, en utilisant les regex pour vérifier si tous les caractères spéciaux sont contenues. S'ils sont trouvés ensuite, nous avons mis CDATA balises autour d'eux. Dans ce cas XMLWriter prend soin de l'ajout de la balise CDATA.
Nous allons utiliser le code suivant pour le marshaling:
Ce serait maréchal de l'objet et de le renvoyer du XML, si nous transmettre une demande pour être mis en ordre comme indiqué ci-dessous.