技术标签: web后端 java JAXB XML javabean 转化
首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用:
1.@XmlRootElement,用于类级别的注解,对应xml的跟元素。通过name属性定义这个根节点的名称。
2.@XmlAccessorType,定义映射这个类中的何种类型都需要映射到xml。(如果不存在@XmlAccessorType,默认使用XmlAccessType.PUBLIC_MEMBER注解)
参数:XmlAccessType.FIELD: java对象中的所有成员变量。
XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量。
XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量。
XmlAccessType.NONE: java对象的所有属性都不映射为xml的元素。
3.@XmlAttribute,用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。
4.@XmlElement,指定一个字段或get/set方法映射到xml的节点。通过name属性定义这个根节点的名称。
5.@XmlElementWrapper,为数组或集合定义一个父节点。通过name属性定义这个父节点的名称。
下面来看一个例子:
先定义一个学生类,Student如下:
package com.quest.software.bus4j.ui.framework.extend.frameParase.test;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
public class Student {
String name; //姓名
String sex; //性别
int number; //学号
String className; //班级
List<String> hobby; //爱好
public Student(){
}
public Student(String name,String sex,int number,
String className,List<String> hobby) {
this.name = name;
this.sex = sex;
this.number = number;
this.className = className;
this.hobby = hobby;
}
@XmlAttribute(name="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlAttribute(name="sex")
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@XmlAttribute(name="number")
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@XmlElement(name="className")
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
@XmlElementWrapper(name="hobbys")
@XmlElement(name = "hobby")
public List<String> getHobby() {
return hobby;
}
public void setHobby(List<String> hobby) {
this.hobby = hobby;
}
}
切记,如果java对象属性同时添加了get和set方法,注解不能定义在属性的定义上,只需在get或者set方法上定义一个即可,否则jaxb会报错!!如下:
Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name "name"
然后再定义学生集合类,StudentList如下:
package com.quest.software.bus4j.ui.framework.extend.frameParase.test;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="list")
public class StudentList {
List<Student> students; //所有学生信息的集合
@XmlElement(name = "student")
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
最后写xml和java对象互转的类(通过Marshaller类实现将对象转换为xml,同时也可利用Unmarshaller类进行xml转换为类):
1.java对象转换为xml:
package com.quest.software.bus4j.ui.framework.extend.frameParase.test;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class BeanToXml {
/**
* java对象转换为xml文件
* @param xmlPath xml文件路径
* @param load java对象.Class
* @return xml文件的String
* @throws JAXBException
*/
public static String beanToXml(Object obj,Class<?> load) throws JAXBException{
JAXBContext context = JAXBContext.newInstance(load);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
StringWriter writer = new StringWriter();
marshaller.marshal(obj,writer);
return writer.toString();
}
public static void main(String[] args) throws JAXBException, IOException {
List<String> hobby = new ArrayList<>();
hobby.add("篮球");
hobby.add("音乐");
hobby.add("乒乓球");
List<Student> studentList = new ArrayList<>();
Student st = new Student("张三","男",10001,"尖子班",hobby);
studentList.add(st);
Student st1 = new Student("李四","男",10002,"普通班",hobby);
studentList.add(st1);
Student st2 = new Student("莉莉","女",10003,"普通班",hobby);
studentList.add(st2);
StudentList students = new StudentList();
students.setStudents(studentList);
String str = BeanToXml.beanToXml(students, StudentList.class);
//写入到xml文件中
String xmlPath = "D:/testConfig.xml";
BufferedWriter bfw = new BufferedWriter(new FileWriter(new File(xmlPath)));
bfw.write(str);
bfw.close();
}
}
<?xml version="1.0" encoding="GBK" standalone="yes"?>
<list>
<student name="张三" number="10001" sex="男">
<className>尖子班</className>
<hobbys>
<hobby>篮球</hobby>
<hobby>音乐</hobby>
<hobby>乒乓球</hobby>
</hobbys>
</student>
<student name="李四" number="10002" sex="男">
<className>普通班</className>
<hobbys>
<hobby>篮球</hobby>
<hobby>音乐</hobby>
<hobby>乒乓球</hobby>
</hobbys>
</student>
<student name="莉莉" number="10003" sex="女">
<className>普通班</className>
<hobbys>
<hobby>篮球</hobby>
<hobby>音乐</hobby>
<hobby>乒乓球</hobby>
</hobbys>
</student>
</list>
package com.quest.software.bus4j.ui.framework.extend.frameParase.test;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
public class XmlToBean {
/**
* xml文件配置转换为对象
* @param xmlPath xml文件路径
* @param load java对象.Class
* @return java对象
* @throws JAXBException
* @throws IOException
*/
public static Object xmlToBean(String xmlPath,Class<?> load) throws JAXBException, IOException{
JAXBContext context = JAXBContext.newInstance(load);
Unmarshaller unmarshaller = context.createUnmarshaller();
Object object = unmarshaller.unmarshal(new File(xmlPath));
return object;
}
public static void main(String[] args) throws IOException, JAXBException {
String xmlPath = "D:/testConfig.xml";
Object object = XmlToBean.xmlToBean(xmlPath,StudentList.class);
StudentList students = (StudentList)object;
List<Student> studentList = students.getStudents();
for(int i=0;i<studentList.size();i++){
System.out.println(studentList.get(i).name);
System.out.println(studentList.get(i).sex);
System.out.println(studentList.get(i).number);
System.out.println(studentList.get(i).className);
for(String str :studentList.get(i).hobby){
System.out.print(str+" ");
}
System.out.println("-------------");
}
}
}
张三
男
10001
尖子班
篮球 音乐 乒乓球 -------------
李四
男
10002
普通班
篮球 音乐 乒乓球 -------------
莉莉
女
10003
普通班
篮球 音乐 乒乓球 -------------
文章浏览阅读1.5k次。Loading场景及持久化场景_unity 持久场景
文章浏览阅读7.3k次。mybatis foreach多次遍历问题:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'payMethod'. Return value ({payMethodNa..._mybatis foreach使用出现返回值不可迭代
文章浏览阅读187次。1如何将字串 String 转换成整数 int?A. 有两个方法:1). int i = Integer.parseInt([String]); 或i = Integer.parseInt([String],[int radix]);2). int i = Integer.valueOf(my_str).intValue();注: 字串转成 Double, Float, Long 的方法大同小异...._java 整数转时间字串
文章浏览阅读9.7k次,点赞9次,收藏32次。文章目录1.老版Android系统 anr的导出2.高版本系统 导出3.ANR的缘由1.老版Android系统 anr的导出在项目目录下或app下运行命令: adb pull data/anr/traces.txt测试了华为p7(Android 5.1.1)和荣耀v10(Android 9),发现都能正常导出。但是遇到华为mate10、mate10 pro 一直都导出失败。adb: e..._adb命令导出高版本的anr文件
文章浏览阅读757次。Oracle RAC的关闭及启动,需要严格按照步骤来执行,以下就以一套实际的系统为例,来介绍RAC的关闭及启动过程:环境说明主机名实例名监听端口字符集db-node1orcl11521ZHS16GBKdb-node2orcl21521ZHS16GBK关闭顺序:关闭数据库(实例)->..._ora...c2.lsnr 启动
文章浏览阅读1w次,点赞7次,收藏30次。1.一维插值interp1()yi=interp1(x,y,xi,method)其中,x、y为已知的数据点;xi为想要插值数据点的横坐标,返回对应的纵坐标yi;method为插值方法,总共有四种:1)‘nearest’:最近邻点插值;2)‘linear’:线性插值;3)‘spline’:三次样条插值;4)‘pchip’:保形分段三次插值。2.二维插值interp2()zi=inte..._插值要求每个网格维度至少有两个采样点。
文章浏览阅读342次。题目编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表,在节点 c1 开始相交:示例 :输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,_链表相交是指针相同吗
文章浏览阅读159次。有效闭包和无效闭包以及闭包的副作用_闭包 return 无效
文章浏览阅读1.2k次,点赞3次,收藏5次。继续更新:2020王道课后习题P18,综合应用题2:将顺序表L中所有的元素逆置,空间复杂度为O(1)。分析:空间复杂度为O(1)说明算法原地工作,所需要的辅助空间为常量,本体算法实现只需要借助一个额外辅助空间,所以符合要求。还是那句话,话休繁琐,代码如下://将顺序表L中所有元素逆置,要求空间复杂度为O(1)# include <stdio.h>#include &..._一维数组的逆置算法,可以达到最好的空间复杂度
文章浏览阅读627次。import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io_sftputil.put
文章浏览阅读1.1w次。微软账号被锁定后的记录历程2020-4-16 凌晨微软账号被锁定,我猜测原因是因为我OneDrive同步数据太多(有一部分是代码,几个G,但是小文件比较多,有1w多个文件),且重复同步了一两次,然后通知我账号被锁定,但是又不告诉我具体是什么原因锁定账号,通知如下。2020-4-16 11:00我通过上图中的网站进行申诉2020-4-16 11:26微软自动回复邮件,如下大致意..._office365账号被锁定了怎么办
文章浏览阅读1.3w次,点赞8次,收藏156次。一、微信小程序的购物车功能在商品列表页 index.wxml 中,给下单按钮绑定一个添加购物车的事件 addCart,使用 catchtap 是不会冒泡,同时传入 data-item,当前的商品,代码如下所示: <view class="order" catchtap="addCart" data-item="{{ item }}">下单</view>..._小程序点击商品到购物车逻辑