2011-07-16 4 views
4

xmlを生成する必要があるサービスがあります。現在、私はStringWriterを使用してxmlを作成するためにjaxbとMarshallerを使用しています。javax.xml.bind.Marshaller 10進値でUnicode文字を符号化する

ここに私が得ている現在の出力があります。

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

これは一部のWebサービスでは問題ありませんが、特別なユニコード文字をエスケープする必要があります。

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

私はcommons-langからStringEscapeUtilsを使用している場合は、私がfollwingのようなもので終わる:私のxmlをcomsumingされるサービスは、これを持っている必要があります。この1も動作しません:

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

は私が彼らの小数値としてこれらの特殊文字をエンコードすることができますマーシャラーのためのいくつかの設定がありますか?

答えて

5

はい、Marshaller.setProperty(jaxb.encoding、エンコード)は、ドキュメントに使用するエンコードを設定します。私は "US-ASCII"がほしいと思います。

+0

é(U + 00E9)はISO-8859-1でサポートされているため、US-ASCIIが優れています。 – McDowell

+0

合意しました、ありがとう-Ed –

+0

私は別のスレッドを開始する必要がありましたが、提案されたロジックを考えて、ユーロシンボルは€に置き換えられ、それもxmlに入りますが、ブラウザでは、何も表示されません。 私はこの理由を知っています。たとえエンコーディングがUS-ASCIIとして指定されていても、ブラウザはUnicode文字としてNumeric文字参照(例えば、€)を扱います。 私たちはUS-ASCII "€"を送信しますが、それはUTF-8と解釈され、制御文字になります。 –

5

Ed Staub suggestsとして、jaxb.encodingプロパティを設定してみてください。 US-ASCIIエンコードでは、最初の128コードポイントを超えるものはエスケープされます。

@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); 
    } 
} 
関連する問題