2010-07-20 174 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