【问题标题】:How to prevent JAXB escaping a string如何防止 JAXB 转义字符串
【发布时间】:2011-03-18 08:54:51
【问题描述】:

我有一个由 XJC 生成的对象,名为 Product。我想将product.currentPrice (a String) 设置为£210,其中£ 是货币符号(从系统的其他地方传入)。

麻烦的是,JAXB 正在逃避我的 & 符号,所以它产生了£210。我怎样才能让它不这样做?

【问题讨论】:

标签: java jaxb


【解决方案1】:

XmlStreamWriter 的解决方案

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

From here

【讨论】:

  • linked answer也有评论:"Not documented, so you can't trust this to work in the future"
【解决方案2】:

如果你实现这个接口: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 实现 AKA jaxb-impl-2.2.1.jar。

希望这对任何人都有帮助,就像它帮助了我一样。

【讨论】:

    【解决方案3】:

    根据您要寻找的内容,您可以:

    • 禁用字符转义
    • 或使用 CDATA 字符串,它可以通过一个 一点配置

    【讨论】:

    • @fred:你有建议的选项,但你没有给出如何做的例子。
    【解决方案4】:

    就像 rjsang 所说,使用“UTF-8”编码时有一个错误,这是默认的。如果您不关心区分大小写的问题,请尝试使用“utf-8”并让您的自定义转义符按预期工作。 UTF-16 也可以工作,除了 "UTF-8": "uTf-8" 等等。

    标准中的严重错误。

    这是执行此操作的代码:

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

    【讨论】:

    • 这对我有帮助,似乎我们不需要使用自定义转义处理程序
    【解决方案5】:

    如何使用 CDATA 部分来包装值,然后使用可以处理 CDATA 的 JAXB 实现,例如 EclipseLink MOXy

    要使用 MOXy 处理 CDATA,请参阅:

    【讨论】:

      【解决方案6】:

      默认情况下,JAXB 的编组器实现通常会转义字符。要更改此默认行为,您必须编写一个实现 com.sun.xml.bind.marshaller.CharacterEscapeHandler 接口的类。

      在 Marshaller 中设置该处理程序

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

      您可以查看 JAXB 提供的示例,字符转义示例

      【讨论】:

      • 好的,这很好,但如果我这样做了,我将不得不编写一个实现来涵盖如何转义每个字符。如果角色不是我感兴趣的角色,我该如何委托默认行为?
      • 我接受这是正确的答案,因为它应该是正确的答案。对于其他阅读本文希望它对您有所帮助的人,由于错误(jaxb.dev.java.net/issues/show_bug.cgi?id=777),这实际上在 JAXB 2.2.1 中不起作用
      • 既然源似乎已经被转义了,那么在传递给 JAXB 之前不应该简单地取消转义吗?
      • 我在网上找到的多种解决方案中,这是最终解决转义问题的一种。谢谢!
      • spring如何用xml配置设置以上属性?
      猜你喜欢
      • 1970-01-01
      • 2015-09-14
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多