废话不多说,写此文档的目的就是为了帮助java开发者,解决利用JAXB生成XML时,XML中带有CDATA问题。

分三步走:

首先创建适配器类:CDataAdapter.java

package com.zhaoyx;

import javax.xml.bind.annotation.adapters.XmlAdapter;

//有时候 Java 类不能自然映射到自己所需的 XML 形式,

//这时需要编写自己的适配器类,通过注解绑定到javabean的成员变量上,

//在运行的时候jaxb框架自动会适配你所编写的适配器类的方法,

//CDataAdapter.marshal(String str),将javabean的成员变量的value值

//转变成你想要的形式。

public class CDataAdapter extends XmlAdapter {

//从javabean到xml的适配方法

@Override

public String marshal(String str) throws Exception {

return "";

}

//从xml到javabean的适配方法

@Override

public String unmarshal(String str) throws Exception {

return str;

}

}

其次创建JAXB生成XML的工具类:JaxbToXmlUtil.java

package com.zhaoyx;

import java.io.IOException;

import java.io.StringWriter;

import java.io.Writer;

import javax.xml.bind.JAXBContext;

import javax.xml.bind.JAXBException;

import javax.xml.bind.Marshaller;

import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;

//这里用到了JAXB的核心类和方法,不懂可以去查看下JAXB基础应用,

//这里只做关键解释。

public class JaxbToXmlUtil {

public static String convertToXml(Object obj, String encoding) {

String result = null;

try {

JAXBContext context = JAXBContext.newInstance(obj.getClass());

Marshaller marshaller = context.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);

//去掉生成xml的默认报文头。

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

//转换所有的适配字符,包括xml实体字符<和>,xml实体字符在好多处理xml

//的框架中是处理不了的,除非序列化。

marshaller.setProperty("com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler",

new CharacterEscapeHandler() {

@Override

public void escape(char[] ch, int start,int length, boolean isAttVal,

Writer writer) throws IOException {

writer.write(ch, start, length);

}

});

StringWriter writer = new StringWriter();

//添加自己想要的xml报文头

writer.write("<?xml version=\'1.0\' encoding=\'" + encoding + "\'?>\n");

marshaller.marshal(obj, writer);

result = writer.toString();

} catch (JAXBException e) {

e.printStackTrace();

}

return result;

}

}

最后创建用于转换成XML文件的javabean:Root.java

package com.zhaoyx;

import javax.xml.bind.annotation.XmlAccessType;

import javax.xml.bind.annotation.XmlAccessorType;

import javax.xml.bind.annotation.XmlRootElement;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement

@XmlAccessorType(XmlAccessType.FIELD)

public class Root {

//绑定自己的适配器类,适配希望包含在CData数据块中的javabean成员变量。

//这里的空值是为了测试,无其他涵义。

@XmlJavaTypeAdapter(CDataAdapter.class)

private String name = "";

@XmlJavaTypeAdapter(CDataAdapter.class)

private String surname;

private String id;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSurname() {

return surname;

}

public void setSurname(String surname) {

this.surname = surname;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

}

上面三步就可以解决利用JAXB生成XML时,XML中包含CDATA数据块的问题。

下面是用于测试的类:JaxbTest.java

package com.zhaoyx;

public class JaxbTest {

public static void main(String[] arg) {

Root root = new Root();

root.setId("ddd");

root.setSurname("jiiii");

//由于在javabean中赋值为空,这句可以不要,也可以去掉javabean中的赋空值语句

root.setName("");

String str = JaxbToXmlUtil.convertToXml(root, "GBK");

System.out.println(str);

}

}

控制台输出结果:

ddd

如有疑问请提出,我会及时回复,多多交流!

java xmladapte_三步解决JAXB生成XML包含CDATA问题—JAVA编程相关推荐

  1. 使用JAXB将XML Schema绑定到Java类

    http://blog.csdn.net/zsyspace/article/details/1786079 Java Architecture for XML Binding (JAXB) 是一项可以 ...

  2. 三步解决Chrome80后提示限制第三方cookie问题

    三步解决Chrome80后提示限制第三方cookie问题 1.进入谷歌实验室,谷歌浏览器地址栏直接输入地址chrome://flags 2.设置SameSite by default cookies ...

  3. python输出结果存到文件拒绝访问_三步解决python PermissionError: [WinError 5]拒绝访问的情况...

    问题描述: 1.当你卸载python库的时候,如:pip uninstall pandas 2.当你想要更新python库的时候,如:pip install --upgrade pandas 等等- ...

  4. 三步解决PDF转JPG,轻松提升办公效率

    当下信息的高速发展,也增强了的社会竞争压力,在快节奏的办公环境里,提升自己的办公效率尤为重要,有的人通过书籍学习合理的办公思维,有的人则运用各种工具来辅助办公,下面要给大家介绍,如何使用转换工具高效地 ...

  5. JAXB生成XML文件去除Standlone

    /**      * JAXB:java对象转换为xml文件(java對象需要添加註解)      * @param obj 要序列化文件的java对象      * @param model jav ...

  6. 重装linux后没声音,笔记本电脑安装ubuntu系统后外放没有声音 ,耳机正常,三步解决办法...

    摘要: 情况是这样的, 之前安装了ubuntu系统,开始系统开机的时候也没有注意有没有声音, 反正我之前在虚拟机安装的时候是正常的, 系统有声音,在虚拟机体验了这个系统感觉还不错,... 情况是这样的 ...

  7. 2k如何联网找不到服务器,NBA2K18无连接服务器怎么办 简单三步解决无法连接服务器问题...

    NBA2K18手游无连接服务器该怎么办,NBA2K18是一款体育篮球游戏,很多的NBA游戏爱好者都非常喜欢和期待这款体育大作,不过许多小伙伴反应在游戏中碰到无法连接服务器的情况,很是头疼,NBA2K1 ...

  8. 【亲测有效】【无需重启电脑】三步解决电脑右键点击桌面没反应

    问题:最近不知道咋了,电脑的小毛病有点多,今天本来想在桌面新建一个word,发现右键没有效果,同时发现在电脑的网页或者文件夹内单击右键,还是有效果的,说明问题是出在我的桌面而不是我的鼠标. 试了一些方 ...

  9. 三步解决,dial tcp: lookup production.cloudflare.docker.com on 114.114.114.114:53: read udp i/o timeout

    突然间,我的docker开始报类似这样的错误 dial tcp: lookup production.cloudflare.docker.com on 114.114.114.114:53: read ...

最新文章

  1. 智能文档理解:通用文档预训练模型
  2. Oracle数据字典
  3. Spring MVC-02循序渐进之解耦控制器和校验器
  4. 3_11 InterpreterMode 解释器模式
  5. leetcode189. 旋转数组
  6. Linux进阶之路——常用命令总结
  7. 【原创】Erlang 之 entop 使用问题
  8. 两行代码实现微信小程序联系人sidebar
  9. 蚁群算法原理及c++实现
  10. 东芝300d硒鼓清零代码_东芝300d怎么清?
  11. flash player 11.2 64位 linux,Adobe Flash Player 11.2.202 Beta 1支持 64位操作系统
  12. 识人 用人 激人 留人 斩人
  13. css_属性选择器(根据属性名或属性值设定指定样式)
  14. android 图片编辑工具,图片编辑工具手机版下载
  15. 光盘或者U盘安装linux操作系统
  16. 洛谷 P1361 小猫爬山
  17. PAT 甲级 1018. Public Bike Management
  18. SpringBoot框架的优点
  19. c语言如何框出视频或图像中的车辆,[转载]视频图像中的车辆检测跟踪和分类
  20. php mysql查询3级分类下对应的一级和二级分类

热门文章

  1. 利用javadoc制作API文档
  2. 社群的发展阶段是怎么样的?
  3. SQL练习题共50道附答案(MySQL)
  4. JS随手记——跨页面传值
  5. 曼哈顿算法公式_距离计算方法总结 | Public Library of Bioinformatics
  6. 雅居乐万豪酒店java_“万豪,我心所属之地” | 上海雅居乐万豪酒店Terence Sun的实习故事...
  7. HTML5的绘图步骤——示例绘制火柴人
  8. 生产环境安装、配置、管理PostgreSQL14.5数据库集群。pgpool 4.3.3参数中文说明
  9. F1--DDR3的应用总结(二)-2021.11.29
  10. html前端学习基础入门教程之HTML代码的优化 关键词密度