How to generate CDATA block using JAXB?

cdata, java, jaxb, xml

Solution

Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.

If you are using MOXy as your JAXB provider then you can leverage the `@XmlCDATA` extension:

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;
   }

}

For More Information

- http://bdoughan.blogspot.com/2010/07/cdata-cdata-run-run-data-run.html

- http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html

Problem

I am using JAXB to serialize my data to XML. The class code is simple as given below. I want to produce XML that contains CDATA blocks for the value of some Args. For example, current code produces this XML: ``` <command> <args> <arg name="test_id">1234</arg> <arg name="source">&lt;html>EMAIL&lt;/html></arg> </args> </command> ``` I want to wrap the "source" arg in CDATA such that it looks like below: ``` <command> <args> <arg name="test_id">1234</arg> <arg name="source"><[![CDATA[<html>EMAIL</html>]]></arg> </args> </command> ``` How can I achieve this in the below code? ``` @XmlRootElement(name="command") public class Command { @XmlElementWrapper(name="args") protected List<Arg> arg; } @XmlRootElement(name="arg") public class Arg { @XmlAttribute public String name; @XmlValue public String value; public Arg() {}; static Arg make(final String name, final String value) { Arg a = new Arg(); a.name=name; a.value=value; return a; } } ```

Original source

Related problems