Comment ajouter & lt;! [CDATA [et]] & gt; en XML préparé par Jaxb
Comment préparer un document XML avec CDATA
Je suis preraring cette réponse par Jaxb,
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<SOAP-ENV:Header/>
<soapenv:Body>
<tem:RequestData>
<tem:requestDocument>
<![CDATA[
<Request>
<Authentication CMId="68" Function="1" Guid="5594FB83-F4D4-431F-B3C5-EA6D7A8BA795" Password="poihg321TR"/>
<Establishment Id="4297867"/>
</Request>
]]>
</tem:requestDocument>
</tem:RequestData>
</soapenv:Body>
</soapenv:Envelope>
Mais de Jaxb je ne suis pas arriver CDATA , comment mettre de la CDATA à l'intérieur de <tem:requestDocument>
élément.
Voici mon Code Java :
public static String test1() {
try {
initJB();
String response = null;
StringBuffer xmlStr = null;
String strTimeStamp = null;
com.cultagent4.travel_republic.gm.Envelope envelope = null;
com.cultagent4.travel_republic.gm.Header header = null;
com.cultagent4.travel_republic.gm.Body body = null;
com.cultagent4.travel_republic.gm.RequestData requestData = null;
com.cultagent4.travel_republic.gm.RequestDocument requestDocument = null;
com.cultagent4.travel_republic.gm.RequestDocument.Request request = null;
com.cultagent4.travel_republic.gm.RequestDocument.Request.Authentication authentication = null;
com.cultagent4.travel_republic.gm.RequestDocument.Request.Establishment establishment = null;
ObjectFactory objFact = new ObjectFactory();
envelope = objFact.createEnvelope();
header = objFact.createHeader();
envelope.setHeader(header);
body = objFact.createBody();
requestData = objFact.createRequestData();
requestDocument = objFact.createRequestDocument();
request = new RequestDocument.Request();
authentication = new RequestDocument.Request.Authentication();
authentication.setCMId("68");
authentication.setGuid("5594FB83-F4D4-431F-B3C5-EA6D7A8BA795");
authentication.setPassword("poihg321TR");
authentication.setFunction("1");
request.setAuthentication(authentication);
establishment = new RequestDocument.Request.Establishment();
establishment.setId("4297867");
request.setEstablishment(establishment);
requestDocument.setRequest(request);
requestData.setRequestDocument(requestDocument);
body.setRequestData(requestData);
envelope.setBody(body);
jaxbMarshallerForBase = jaxbContextForBase.createMarshaller();
OutputStream os = new ByteArrayOutputStream();
System.out.println();
//output pretty printed
// jaxbMarshallerForBase.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// jaxbMarshallerForBase.marshal(envelope, System.out);
// jaxbMarshallerForBase.marshal(envelope, os);
jaxbMarshallerForBase.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
jaxbMarshallerForBase.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// jaxbMarshallerForBase.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
//get an Apache XMLSerializer configured to generate CDATA
XMLSerializer serializer = getXMLSerializer();
//marshal using the Apache XMLSerializer
SAXResult result = new SAXResult(serializer.asContentHandler());
System.out.println("*************");
jaxbMarshallerForBase.marshal(envelope, result);
System.out.println("--------------");
return null;
} catch (JAXBException ex) {
Logger.getLogger(GM_TravelRepublic.class.getName()).log(Level.SEVERE, null, ex);
} finally {
return null;
}
}
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.
of.setCDataElements(new String[]{"^Request","^Authentication","^Establishment"});
//set any other options you'd like
of.setPreserveSpace(true);
of.setIndenting(true);
StringWriter writer = new StringWriter();
//create the serializer
XMLSerializer serializer = new XMLSerializer(of);
serializer.setOutputByteStream(System.out);
return serializer;
}
Ici, je suis même fichier xml , mais sans CDATA. Mon serveur n'est pas l'acceptation de la requête sans CDATA.S'il vous plaît aider.
source d'informationauteur LMK
Vous devez vous connecter pour publier un commentaire.
Pouvez-vous faire de la logique à partir de ce
importations
exemple de code
import javax.xml.bind.annotation.les adaptateurs.XmlAdapter;
public class CDATAAdapter s'étend XmlAdapter {
}
À l'intérieur de votre Java Bean ou POJO définir XMLJavaTypeAdapter sur la chaîne obligatoire dans CDATA
@XmlJavaTypeAdapter(value=CDATAAdapter.class)
private String message;
Par défaut, le marshaller mise en œuvre de la JAXB RI tente d'échapper les caractères. Pour changer ce comportement, nous écrire une classe qui
met en œuvre la CharacterEscapeHandler.
Cette interface dispose d'une méthode d'échappement qui doit être remplacée.
import com.soleil.xml.interne.bind.marshaller.CharacterEscapeHandler;
Deuxièmement, il cn également être fait via Eclipse MOXy mise en œuvre.
CDATA
est des données de caractère, elle ressemble à votre serveur veut que la partie de l'XML de départ avecRequest
à venir en tant que texte. Il peut être suffisant pour vous de créer unXmlAdapter
pour convertir l'instance deRequest
à unString
. Les caractères obtenus seront là n'ont pas échappé à CDATA mais cela Peut s'adapter à votre cas d'utilisation.Alors si vous en avez vraiment besoin que CDATA en plus de la
XmlAdapter
vous pouvez appliquer l'une des stratégies décrites dans le lien ci-dessous:De la setCDataElements description de la méthode dans Apache docs :
Sets the list of elements for which text node children should be output as CDATA.
Ce que je pense que cela signifie est, les enfants de la
tem:requestDocument
élément qui devraient faire partie d'un seul morceau de texte (et non pas les éléments xml par eux-mêmes) dans l'ordre pour que cela fonctionne. Une fois que vous avez fait cela, probablement d'un simpledevrait faire l'affaire.
Essayez-le et laissez-moi savoir 🙂
Je pense que dans votre
private static XMLSerializer getXMLSerializer()
méthode vous sont mauvais réglage de laCDATA
éléments, parce que votreCDATA
élément est<tem:requestDocument>
au lieu deRequest
Authentication
etEstablishment
qui sont le contenu. Essayez avec:au lieu de:
Espère que cette aide,
Votre serveur attend
<tem:requestDocument>
pour contenir texteet pasun
<Request>
élément.CDATA
est vraiment utile pour la création écrite à la mainXML de sorte que vous n'avez pas à vous inquiéter au sujet d'échapper à XML incorporé. La chose est,
JAXB poignées échapper à l'amende juste et si votre serveur est une bonne XML citoyen, il devrait
traiter correctement échappé XML le même que le XML dans un
CDATA
bloc.Ainsi, au lieu de l'ajout d'un demande élément à l'intérieur de votre requestDocument comme
vous n':
Vous devez d'abord utiliser JAXB pour le maréchal demande dans un échappées de la Chaîne
et ensemble que sa la requestDocument valeur:
La mise en œuvre de
marshal(request)
est laissée en exercice. 😉