2011-07-16 5 views
4

J'ai un service qui doit générer xml. Actuellement j'utilise jaxb et un Marshaller pour créer le xml en utilisant un StringWriter.javax.xml.bind.Marshaller codant des caractères Unicode avec leurs valeurs décimales

Voici la sortie actuelle que je reçois.

<CompanyName>Bakery é &amp;</CompanyName> 

Bien que cela puisse convenir à certains services Web, j'ai besoin d'échapper des caractères Unicode spéciaux. Le service qui est comsuming mon xml doit avoir ceci:

<CompanyName>Bakery &#233; &amp;</CompanyName> 

Si je StringEscapeUtils de commons-lang je me retrouve avec quelque chose comme le follwing. Celui-ci ne fonctionne pas aussi:

<CompanyName>Bakery &amp;#233; &amp;amp;</CompanyName> 

Y a-t-il des paramètres du Marshaller qui me permettra d'encoder ces caractères spéciaux comme leurs valeurs décimales?

Répondre

5

Oui, Marshaller.setProperty (jaxb.encoding, codant) définira l'encodage à utiliser pour le document. Je suppose que vous voulez "US-ASCII".

+0

'é' (U + 00E9) est supporté par ISO-8859-1, donc US-ASCII serait meilleur. – McDowell

+0

D'accord, merci -Ed –

+0

Bien que j'aurais dû commencer un fil différent, mais juste en pensant, avec la logique qui a été suggérée, le symbole de l'euro est remplacé par € et il va aussi dans le xml, mais quand j'essaie de le voir dans le navigateur, ça ne montre rien. Je connais la raison pour laquelle, même si le codage est spécifié en US-ASCII, le navigateur traite les références de caractères numériques (telles que €) comme des caractères Unicode, quel que soit le codage utilisé pour votre document. Donc, nous envoyons US-ASCII "€", mais cela est interprété comme UTF-8 et donc il devient le caractère de contrôle qui est un "vide" .. –

5

En tant que Ed Staub suggests, essayez de définir la propriété jaxb.encoding. Le codage US-ASCII entraînera l'échappement de tout élément au-dessus des 128 premiers points de code.

@XmlRootElement(name = "Company") 
public class Company { 
    private String companyName = "Bakery \u00E9 &"; 

    @XmlElement(name = "CompanyName") 
    public String getCompanyName() { return companyName; } 
    public void setCompanyName(String bar) { this.companyName = bar; } 

    public static void main(String[] args) throws Exception { 
    JAXBContext ctxt = JAXBContext.newInstance(Company.class); 
    Marshaller m = ctxt.createMarshaller(); 
    m.setProperty("jaxb.encoding", "US-ASCII"); 
    m.marshal(new Company(), System.out); 
    } 
} 
Questions connexes