2010-07-20 171 views
12

我有一個對象,由XJC生成,調用Product。我想將product.currentPrice (a String)設置爲£210,其中£是貨幣符號(從系統中的其他位置傳入)。如何防止JAXB轉義字符串

問題是,JAXB正在逃避我的符號,所以它產生了£210。我如何讓它不這樣做?

+0

可能重複? http://stackoverflow.com/questions/1506663/can-i-force-jaxb-not-to-convert-into-quot-for-example-when-marshalling-to-x – 2010-07-20 11:02:30

回答

10

默認情況下,JAXB的編組器實現通常會轉義字符。要改變這個默認行爲,你將不得不編寫一個實現了接口com.sun.xml.bind.marshaller.CharacterEscapeHandler的類。

集現Marshaller

CharacterEscapeHandler escapeHandler = NoEscapeHandler.theInstance; 
marshaller.setProperty("com.sun.xml.bind.characterEscapeHandler", escapeHandler); 

該處理程序,您可以看看提供JAXB樣品,字符轉義樣品

+1

好的,這很好,但如果我那麼我是否被迫編寫一個涵蓋如何逃避每一個字符的實現。如果角色不是我感興趣的角色,我該如何委派到默認行爲? – rjsang 2010-07-20 11:31:21

+1

我接受這是正確的答案,因爲它應該是正確的答案。對於任何閱讀本文希望它會幫助你的人來說,這實際上並不適用於JAXB 2.2.1,因爲有一個bug(https://jaxb.dev.java.net/issues/show_bug.cgi?id=777) – rjsang 2010-07-20 16:27:37

+0

由於它似乎已經逃脫了源代碼,不應該在傳遞給JAXB之前簡單地轉義它嗎? – herman 2015-05-12 10:48:56

0

,具體取決於您是否完全找你可以:

  • 禁用字符退出的仿照
  • 或使用哪個支持可以添加到JAXB只需 位配置
7

像rjsang所述CDATA串,有一個錯誤使用「UTF-8」的編碼,這是默認時。如果您不關心區分大小寫的問題,請嘗試使用「utf-8」並讓您的自定義助手按其應有的工作。 UTF-16也可以工作,除了「UTF-8」:「uTf-8」等。

標準中的可怕錯誤。

下面是代碼這樣做:

marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "utf-8"); 
+0

這幫助了我,似乎我們不需要使用自定義轉義處理程序 – Akceptor 2017-08-08 13:17:59

1

如果您實現這個接口:com.sun.xml.bind.marshaller.CharacterEscapeHandler,用自己的字符轉義,但你要委託某些行爲傳統的轉義,你可以使用這些clases的(或寫根據他們自己的代碼):

  • com.sun.xml.bind.marshaller.MinimumEscapeHandler
  • com.sun.xml.bind .marshaller.NioEscapeHandler
  • com.sun.xml.bind.marshaller.DumbEscapeHandler

他們來與JAXB RI執行AKA JAXB-implement執行-2.2.1.jar。

希望這個幫助給任何人,就像它幫助了我。

1

解決方案XmlStreamWriter

final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory(); 
streamWriterFactory.setProperty("escapeCharacters", false); 

From here