如何在Java对象生成的XML中添加<![CDATA[标签?
给JAXB生成的XML添加CDATA标签
要实现你期望的XML结构,需要修改现有Java类并利用JAXB的注解处理CDATA,具体步骤如下:
1. 修改Java类结构
首先要给Inflow类添加存储CDATA内容的字段,同时确保所有属性提供getter/setter方法(JAXB需要通过这些方法访问属性):
修改后的CERequest.java
public class CERequest { private Inflow inflow; public Inflow getInflow() { return inflow; } public void setInflow(Inflow inflow) { this.inflow = inflow; } }
修改后的Inflow.java(方法一:使用@XmlCDATA注解)
JAXB 2.0及以上版本支持@XmlCDATA注解,直接标注在内容字段上即可自动生成CDATA包裹:
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlCDATA; import javax.xml.bind.annotation.XmlValue; public class Inflow { @XmlAttribute private String format; // 存储CDATA内的XML内容 @XmlValue @XmlCDATA private String content; public String getFormat() { return format; } public void setFormat(String format) { this.format = format; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
方法二:自定义XmlAdapter(兼容低版本JAXB)
如果你的JAXB版本不支持@XmlCDATA,可以自定义适配器手动生成CDATA标签:
第一步:创建CDATA适配器类
import javax.xml.bind.annotation.adapters.XmlAdapter; public class CDATAAdapter extends XmlAdapter<String, String> { @Override public String unmarshal(String v) throws Exception { return v; } @Override public String marshal(String v) throws Exception { return "<![CDATA[" + v + "]]>"; } }
第二步:修改Inflow.java使用适配器
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlValue; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; public class Inflow { @XmlAttribute private String format; @XmlValue @XmlJavaTypeAdapter(CDATAAdapter.class) private String content; // getter和setter方法同方法一 }
2. 生成带CDATA的XML
构造对象并执行marshal逻辑时,直接给Inflow的content字段赋值你需要放在CDATA中的XML内容即可:
public class Main { public static void main(String[] args) throws Exception { CERequest request = new CERequest(); Inflow inflow = new Inflow(); inflow.setFormat("1"); // 直接传入原始XML内容,无需转义 inflow.setContent("<DOC id=\"2229901\"></DOC>"); request.setInflow(inflow); JAXBContext jaxbContext = JAXBContext.newInstance(CERequest.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 可选,格式化XML输出 StringWriter sw = new StringWriter(); jaxbMarshaller.marshal(request, sw); String xmlString = sw.toString(); System.out.println(xmlString); } }
最终生成的XML
执行上述代码后,会输出符合你需求的XML结构:
<CERequest> <inflow format="1"> <![CDATA[ <DOC id="2229901"></DOC> ]]> </inflow> </CERequest>
内容的提问来源于stack exchange,提问作者rabin samanta
相关产品推荐
相关产品推荐

