2011-07-16 20 views
4

我有一個需要生成xml的服務。目前我正在使用jaxb和Marshaller使用StringWriter創建xml。javax.xml.bind.Marshaller編碼帶有十進制值的Unicode字符

這是我正在得到的當前輸出。

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

雖然這可能適用於某些web服務,但我需要轉義特殊的unicode字符。即comsuming我的XML服務需要有這樣的:

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

如果我使用StringEscapeUtilscommons-lang我結束了類似的follwing。這其中不也行:

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

是否有現Marshaller,讓我來編碼這些特殊字符作爲其十進制值的一些設置?

回答

5

是的,Marshaller.setProperty(jaxb.encoding,編碼)將設置用於文檔的編碼。我猜你想要「US-ASCII」。

+0

ISO-8859-1支持'é'(U + 00E9),所以US-ASCII會更好。 – McDowell

+0

同意,謝謝-Ed –

+0

雖然我應該開始一個不同的線程,但只是想着,用已經建議的邏輯,歐元符號被替換爲€,它也在xml中,但是當我嘗試看到它時在瀏覽器中,它什麼都不顯示。 我知道原因,即使編碼指定爲US-ASCII,瀏覽器也會將數字字符引用(如€)視爲Unicode字符 - 無論您使用什麼編碼方式處理文檔。 因此,我們發送美國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); 
    } 
} 
相關問題