【问题标题】:JAXB marshalling and unmarshalling CDATAJAXB 编组和解组 CDATA
【发布时间】:2011-11-24 02:49:30
【问题描述】:

我有一个要求,我有这样的 XML

<programs>
   <program>
      <name>test1</name>
      <instr><![CDATA[ some string ]]></instr>
   </program>
   <program>
      <name>test2</name> 
      <instr><![CDATA[ some string ]]></instr>
   </program>
</programs>

我的程序需要将其解组到 JAXB,进行一些处理,最后编组回 xml。当我最终将 JAXB 对象编组为 xml 时,我得到了没有 CDATA 前缀的纯文本。但是为了保持 xml 完整,我需要用 CDATA 前缀取回 xml。似乎 JAXB 不直接支持这一点。有没有办法做到这一点?

【问题讨论】:

    标签: jaxb marshalling cdata


    【解决方案1】:

    CDATA 与否,这应该不是问题,因为如果需要,JAXB 的输出将被转义。

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题,在查看 SO 时我发现了这篇文章。由于我使用 xjc 生成我的 bean,我不想在生成的代码中添加 @XmlCData。

      找了好久终于找到了这个帖子:http://javacoalface.blogspot.pt/2012/09/outputting-cdata-sections-with-jaxb.html

      其中包含以下示例代码:

      DocumentBuilderFactory docBuilderFactory = 
      DocumentBuilderFactory.newInstance();
      Document document = 
      docBuilderFactory.newDocumentBuilder().newDocument();
      
      // Marshall the feed object into the empty document.
      jaxbMarshaller.marshal(jaxbObject, document);
      
      // Transform the DOM to the output stream
      // TransformerFactory is not thread-safe
      StringWriter writer = new StringWriter();
      TransformerFactory transformerFactory = 
      TransformerFactory.newInstance();
      Transformer nullTransformer = transformerFactory.newTransformer();
      nullTransformer.setOutputProperty(OutputKeys.INDENT, "yes");
      nullTransformer.setOutputProperty(
      OutputKeys.CDATA_SECTION_ELEMENTS,
       "myElement myOtherElement");
      nullTransformer.transform(new DOMSource(document),
       new StreamResult(writer));
      

      它对我来说很好用。希望它可以帮助其他登陆此页面的人寻找与我相同的东西。

      【讨论】:

      • 像魅力一样工作!恕我直言最好的选择,因为它不需要 MOXy 并在指定元素中注入 CDATA(而不是自定义序列化程序类型的解决方案)。 @YMomb:JAXB 将转义字符串中的任何 XML 内容,但有时您更喜欢在标签内使用 xml 格式的字符串,以便轻松复制粘贴。
      • @Kangur:很高兴我能帮上忙。
      【解决方案3】:

      注意:我是 EclipseLink JAXB (MOXy) 负责人,也是 JAXB 2 (JSR-222) 专家组的成员。

      您可以使用 MOXy 的 @XmlCDATA 扩展来强制使用 CDATA 包装文本节点:

      package blog.cdata;
      
      import javax.xml.bind.annotation.XmlRootElement;
      import org.eclipse.persistence.oxm.annotations.XmlCDATA;
      
      @XmlRootElement(name="c")
      public class Customer {
      
         private String bio;
      
         @XmlCDATA
         public void setBio(String bio) {
            this.bio = bio;
         }
      
         public String getBio() {
            return bio;
         }
      
      }
      

      更多信息

      【讨论】:

      • 我想坚持使用 JAXB 的默认实现。一个接近解决这个问题的方法是jaxb.java.net/faq/JaxbCDATASample.java。但 XMLSerializer 已被弃用,需要寻找替代方案。
      • @Blaise Doughan 我使用 MOXy 2.1.2 并且 XmlCDATA 未知。我在 MOXy 的类路径中使用了 4 个 JAR:org.eclipse.persistence.antlr-2.1.2.jar , org.eclipse.persistence.asm-2.1.2.jar , org.eclipse.persistence.core-2.1.2.jar , org.eclipse.persistence.moxy-2.1.2.jar
      • @basZero - 在 EclipseLink MOXy 2.2 中添加了 @XmlCDATA。当前版本是 2.4.1。
      • @basZero - 是的,应该只是替代品。
      • @basZero - 您可以通过以下链接获取捆绑包:eclipse.org/eclipselink/downloads/previous_releases.php
      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 2014-10-07
      • 2013-05-17
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多