废话不多说,写此文档的目的就是为了帮助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用jaxb三步解析xml_三步解决JAXB生成XML包含CDATA问题相关推荐

  1. java xmladapte_三步解决JAXB生成XML包含CDATA问题—JAVA编程

    废话不多说,写此文档的目的就是为了帮助java开发者,解决利用JAXB生成XML时,XML中带有CDATA问题. 分三步走: 首先创建适配器类:CDataAdapter.java package co ...

  2. java 生成xml cdata_XML CDATA是什么?

    All text in an XML document will be parsed by the parser. XML文档中的所有文本都会被解析器解析. Only text inside a CD ...

  3. java bean 数据库表_如何从数据库的表格自动生成javabean,包含get/set方法等

    Torque是一种ORM的工具,它最早是Apache  Jakarta  Turbine项目的一部分,现在已经从Turbine中剥离出来,可以独立使用.目前,它的版本是3.0. Torque的主要特性 ...

  4. java 生成xml cdata_java注解生成xml和包含CDATA问题

    百度java生成xml,有一大推的文章,主要的生成方式一种使用Dom4J ,还有一种使用Jdk自带注解类! 下面主要整理我注解类的使用,(可以参考这篇文章Dom4J生成xml和包含CDATA问题)和x ...

  5. Java基础之String深入解析

    Java基础之String深入解析 以下是本文目录大纲 生成地方和地址指向,intern()方法 String可否被继承? 1. 生成地方和地址指向,intern()方法 先看代码 String s1 ...

  6. python etree创建xml_利用 Python ElementTree 生成 xml的实例

    Python 处理 xml 文档的方法有很多,除了经典的 sax 和 dom 之外,还有一个 ElementTree. 首先 import 之: from xml.etree import Eleme ...

  7. vue+axios+qs序列化 “三步解析”【含demo实例】- 代码篇

    文章目录 qs序列化:是什么?为什么?怎么办?`实例截图参考` 一.`(简单了解)` · `三步解析 ` 序列化是一种用来处理对象流的机制: 对象.文件.数据,有许多不同的格式,很难统一传输和保存 序 ...

  8. java蓝桥杯凑算是,第七届蓝桥杯JAVA B组真题解析-凑算式(第三题)

    第七届蓝桥杯JAVA B组真题解析-凑算式(第三题) 凑算式 A+B/C+DEF/GHI =10 (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. ...

  9. java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊...

    java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊 java 调用 C# 类库搞定,可以调用任何类及方法,很简单,非常爽啊 总体分三步走: 一.准备一个 C# 类库 (d ...

  10. Java jdk环境变量配置只需三步(大三学生亲测有效)

    目录 前置准备(小白从这里看) 第一步 第二步 三步配置(回顾从这里看) 第一步 第二步 第三步 前置准备(小白从这里看) 第一步 第二步 三步配置(回顾从这里看) 第一步 配置JAVA_HOME:将 ...

最新文章

  1. mysql优化说明_MySQL性能优化各个参数解释说明
  2. [GXOI/GZOI2019]与或和
  3. Juniper EX3400 Rescue configuration is not set
  4. hive udf 分组取top1_Hive分组取Top K数据
  5. 元组、字典、集合的常用方法
  6. maven 强制更新_maven入坑指南
  7. UVA12439 February 29【日期计算】
  8. 数据库系统原理——数据库编程
  9. 中兴手机数据通道打不开_中兴RRU故障排查指导手册
  10. POJ 3295.Tautology
  11. dat image 微信_微信Dat文件解码,PC微信加密图片解密工具
  12. WannaCry爆发一年后,EternalBlue的威胁仍然存在
  13. Matlab给图片加网格
  14. 蚂蚁金服服务注册中心数据一致性方案分析 | SOFARegistry 解析
  15. 多次赔付的重疾险真的有必要吗?
  16. linux kernel 文件夹,Linux kernel 文件夹说明
  17. mysql over rank_mysql实现Oracle 的rank() over()函数
  18. 计算机能模拟图灵机吗,图灵机能够模拟计算机,但计算机难以模拟图灵机。()
  19. 小米2013校园招聘笔试题
  20. 面试智力题:海盗分珍珠

热门文章

  1. python 栅格转矢量_python 矢量数据转栅格数据代码实例
  2. 【人工智能】重磅发布人工智能与机器学习全景式概览
  3. 外卖行业现状分析_2020年中国外卖行业市场现状和发展趋势分析 外卖下沉趋势明显「组图」...
  4. Blender3.0一些建模技巧与应用
  5. mzy git学习,分支冲突,以及冲突解决(五)
  6. ubuntu本地安装中文
  7. 计算机会说,计算机会有意识吗?你以为就我们才有吗~
  8. Linux实用命令之 xdg-open 打开资源管理器
  9. 重磅长文!先进院李骁健等人:在体神经界面技术的发展-从小到大规模记录
  10. hosts文件在哪里,怎样配置修改hosts文件