java用jaxb三步解析xml_三步解决JAXB生成XML包含CDATA问题
废话不多说,写此文档的目的就是为了帮助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问题相关推荐
- java xmladapte_三步解决JAXB生成XML包含CDATA问题—JAVA编程
废话不多说,写此文档的目的就是为了帮助java开发者,解决利用JAXB生成XML时,XML中带有CDATA问题. 分三步走: 首先创建适配器类:CDataAdapter.java package co ...
- java 生成xml cdata_XML CDATA是什么?
All text in an XML document will be parsed by the parser. XML文档中的所有文本都会被解析器解析. Only text inside a CD ...
- java bean 数据库表_如何从数据库的表格自动生成javabean,包含get/set方法等
Torque是一种ORM的工具,它最早是Apache Jakarta Turbine项目的一部分,现在已经从Turbine中剥离出来,可以独立使用.目前,它的版本是3.0. Torque的主要特性 ...
- java 生成xml cdata_java注解生成xml和包含CDATA问题
百度java生成xml,有一大推的文章,主要的生成方式一种使用Dom4J ,还有一种使用Jdk自带注解类! 下面主要整理我注解类的使用,(可以参考这篇文章Dom4J生成xml和包含CDATA问题)和x ...
- Java基础之String深入解析
Java基础之String深入解析 以下是本文目录大纲 生成地方和地址指向,intern()方法 String可否被继承? 1. 生成地方和地址指向,intern()方法 先看代码 String s1 ...
- python etree创建xml_利用 Python ElementTree 生成 xml的实例
Python 处理 xml 文档的方法有很多,除了经典的 sax 和 dom 之外,还有一个 ElementTree. 首先 import 之: from xml.etree import Eleme ...
- vue+axios+qs序列化 “三步解析”【含demo实例】- 代码篇
文章目录 qs序列化:是什么?为什么?怎么办?`实例截图参考` 一.`(简单了解)` · `三步解析 ` 序列化是一种用来处理对象流的机制: 对象.文件.数据,有许多不同的格式,很难统一传输和保存 序 ...
- java蓝桥杯凑算是,第七届蓝桥杯JAVA B组真题解析-凑算式(第三题)
第七届蓝桥杯JAVA B组真题解析-凑算式(第三题) 凑算式 A+B/C+DEF/GHI =10 (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. ...
- java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊...
java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊 java 调用 C# 类库搞定,可以调用任何类及方法,很简单,非常爽啊 总体分三步走: 一.准备一个 C# 类库 (d ...
- Java jdk环境变量配置只需三步(大三学生亲测有效)
目录 前置准备(小白从这里看) 第一步 第二步 三步配置(回顾从这里看) 第一步 第二步 第三步 前置准备(小白从这里看) 第一步 第二步 三步配置(回顾从这里看) 第一步 配置JAVA_HOME:将 ...
最新文章
- mysql优化说明_MySQL性能优化各个参数解释说明
- [GXOI/GZOI2019]与或和
- Juniper EX3400 Rescue configuration is not set
- hive udf 分组取top1_Hive分组取Top K数据
- 元组、字典、集合的常用方法
- maven 强制更新_maven入坑指南
- UVA12439 February 29【日期计算】
- 数据库系统原理——数据库编程
- 中兴手机数据通道打不开_中兴RRU故障排查指导手册
- POJ 3295.Tautology
- dat image 微信_微信Dat文件解码,PC微信加密图片解密工具
- WannaCry爆发一年后,EternalBlue的威胁仍然存在
- Matlab给图片加网格
- 蚂蚁金服服务注册中心数据一致性方案分析 | SOFARegistry 解析
- 多次赔付的重疾险真的有必要吗?
- linux kernel 文件夹,Linux kernel 文件夹说明
- mysql over rank_mysql实现Oracle 的rank() over()函数
- 计算机能模拟图灵机吗,图灵机能够模拟计算机,但计算机难以模拟图灵机。()
- 小米2013校园招聘笔试题
- 面试智力题:海盗分珍珠
热门文章
- python 栅格转矢量_python 矢量数据转栅格数据代码实例
- 【人工智能】重磅发布人工智能与机器学习全景式概览
- 外卖行业现状分析_2020年中国外卖行业市场现状和发展趋势分析 外卖下沉趋势明显「组图」...
- Blender3.0一些建模技巧与应用
- mzy git学习,分支冲突,以及冲突解决(五)
- ubuntu本地安装中文
- 计算机会说,计算机会有意识吗?你以为就我们才有吗~
- Linux实用命令之 xdg-open 打开资源管理器
- 重磅长文!先进院李骁健等人:在体神经界面技术的发展-从小到大规模记录
- hosts文件在哪里,怎样配置修改hosts文件