JAXB编组和解组CDATA

时间:2011-09-24 04:13:34

标签: jaxb marshalling cdata

我有一个要求,我有这样的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不直接支持这一点。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我也遇到了同样的问题,在查看时我找到了这篇文章。因为我用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));

它对我来说非常好。希望它可以帮助其他人登陆这个页面寻找同样的东西。

答案 2 :(得分:0)

注意:我是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;
   }

}

了解更多信息