You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:03:27