如何防止JAXB转义字符串
我有一个由XJC生成的对象,叫做Product
。 我想将product.currentPrice (a String)
设置为£210
其中£
是货币符号(从系统的其他地方传入)。
麻烦的是,JAXB正在逃避我的&号,所以它产生£210
。 我怎么做不这样做?
默认情况下,JAXB的marshaller实现通常会转义字符。 要更改此默认行为,您必须编写一个实现com.sun.xml.bind.marshaller.CharacterEscapeHandler
接口的类。
在Marshaller中设置该处理程序
CharacterEscapeHandler escapeHandler = NoEscapeHandler.theInstance; marshaller.setProperty("com.sun.xml.bind.characterEscapeHandler", escapeHandler);
您可以查看JAXB提供的样本,字符转义样本
就像rjsang所说,使用“UTF-8”编码时存在一个错误,这是默认情况。 如果您不关心区分大小写的问题,请尝试使用“utf-8”并让您的自定义转发器按预期工作。 UTF-16也适用,除了“UTF-8”之外的任何东西:“uTf-8”等等。
标准中的可怕错误。
这是执行此操作的代码:
marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "utf-8");
XmlStreamWriter的解决方案
final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory(); streamWriterFactory.setProperty("escapeCharacters", false);
从这里
如果你实现这个接口:com.sun.xml.bind.marshaller.CharacterEscapeHandler,你自己的角色转义,但你想将一些行为委托给传统的转义,你可以使用任何这些条款(或编写自己的代码)在他们):
- com.sun.xml.bind.marshaller.MinimumEscapeHandler
- com.sun.xml.bind.marshaller.NioEscapeHandler
- com.sun.xml.bind.marshaller.DumbEscapeHandler
它们随附JAXB RI Implementation AKA jaxb-impl-2.2.1.jar。
希望这对任何人都有帮助,就像它帮助了我一样。
如何使用CDATA部分来包装值,然后使用可以处理CDATA的JAXB实现,例如EclipseLink MOXy ?
要使用MOXy处理CDATA,请参阅:
根据您正在寻找的内容,您可以:
- 禁用字符转义
- 或者使用CDATA字符串,可以通过一些配置将支持添加到JAXB中