使用JAXB时,xml与java对象互转以及初始情况下直接由模板xml生成javabean
来源:互联网 发布:淘宝店铺怎么设置秒杀 编辑:程序博客网 时间:2024/05/03 07:35
在日常开发中有时会使用到xml来实现服务器间的数据交互,但是拼凑xml有时会耗费大量的时间甚至会出很多错误,作为java开发者我们如果能用直接操作java对象来处理当时是最好的,只需要在整理好数据对像后调用统一的访问方法即可,这时候我们可以使用JAXB
要使用JAXB,需要一个与xml模板对应的javabean,比如
xml模板:
<?xml version="1.0" encoding="UTF-8"?><testList><test><name></name><age></age></test></testList>
对应javabean文件:
//// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> // Any modifications to this file will be lost upon recompilation of the source schema. // Generated on: 2017.09.26 at 04:39:37 PM CST //package com.test;import java.util.ArrayList;import java.util.List;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;/** * <p>Java class for anonymous complex type. * * <p>The following schema fragment specifies the expected content contained within this class. * * <pre> * <complexType> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <choice maxOccurs="unbounded" minOccurs="0"> * <element name="test"> * <complexType> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element name="name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="age" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * </sequence> * </restriction> * </complexContent> * </complexType> * </element> * </choice> * </restriction> * </complexContent> * </complexType> * </pre> * * */@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "", propOrder = { "test"})@XmlRootElement(name = "testList")public class TestBean { protected List<TestBean.Test> test; /** * Gets the value of the test property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the test property. * * <p> * For example, to add a new item, do as follows: * <pre> * getTest().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@link TestBean.Test } * * */ public List<TestBean.Test> getTest() { if (test == null) { test = new ArrayList<TestBean.Test>(); } return this.test; } /** * <p>Java class for anonymous complex type. * * <p>The following schema fragment specifies the expected content contained within this class. * * <pre> * <complexType> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element name="name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="age" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * </sequence> * </restriction> * </complexContent> * </complexType> * </pre> * * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "name", "age" }) public static class Test { protected String name; protected String age; /** * Gets the value of the name property. * * @return * possible object is * {@link String } * */ public String getName() { return name; } /** * Sets the value of the name property. * * @param value * allowed object is * {@link String } * */ public void setName(String value) { this.name = value; } /** * Gets the value of the age property. * * @return * possible object is * {@link String } * */ public String getAge() { return age; } /** * Sets the value of the age property. * * @param value * allowed object is * {@link String } * */ public void setAge(String value) { this.age = value; } }}
java对象转xml
此模板中假设testlist是个团队,我们要把每个人test的信息存入,信息是姓名name和年龄age,可以先用java对象进行以下操作:
TestBean test = new TestBean(); List<TestBean.Test> testDataList = test.getTest(); TestBean.Test testData = new TestBean.Test(); testData.setName("aa"); testData.setAge("11"); testDataList.add(testData);
这就将一个名叫aa年龄11的人的信息加入了,接着我们写一个公共转换方法:
public static String JObjToXml(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); StringWriter writer = new StringWriter(); marshaller.marshal(obj, writer); result = writer.toString(); } catch (Exception e) { e.printStackTrace(); } return result; }
然后只要调用即可:
System.out.println(JObjToXml(test, "UTF-8"));输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testList>
<test>
<name>aa</name>
<age>11</age>
</test>
</testList>
xml转Java对象
模板依然同上,只需下面这个方法:
@SuppressWarnings("unchecked") public static <T> T xmlToJavaObj(String xml, Class<T> c) { T t = null; try { JAXBContext context = JAXBContext.newInstance(c); Unmarshaller unmarshaller = context.createUnmarshaller(); t = (T)unmarshaller.unmarshal(new StringReader(xml)); } catch (Exception e) { e.printStackTrace(); } return t; }
调用时传入xml字符串及要转换的javaclass即可,注意模板要对应
String xmlStr = "<?xml version=\"1.0\" encoding=\"utf8w2\" standalone=\"yes\"?><testList><test><name>aa</name><age>11</age></test></testList>";TestBean convertTestBean = xmlToJavaObj(xmlStr, TestBean.class);System.out.println(convertTestBean.getTest().get(0).getName());System.out.println(convertTestBean.getTest().get(0).getAge());
输出结果:
aa
11
如何得到xml模板对应的javabean文件
方法1:手动写入,这个在这里不作太多说明,写javabean的时候需要注意属性名及注释不要有错
方法2:使用xsd及xjc根据xml模板转换:
1.准备工作:你需要有xsd.exe这个程序,一般是在Microsoft SDKs\Windows\v7.1\Bin这个路径下,前提是你已经安装了Microsoft SDK,如果没有就去官网下载安装一个(地址:https://www.microsoft.com/en-us/download/details.aspx?id=8279 我是win7所以装的7.1,可自行选择);其次你需要有JDK(基本都有否则怎么用JAXB),xjc.exe的路径在jdk1.7.0_79\bin下;最后你需要一个已经整理好的xml模板(后面就使用文章中的这个模板)
2.打开cmd,进入到xsd所在目录,运行xsd D:\xsdTest\test.xml /out:D:\xsdTest ,至于具体参数怎么用敲个xsd /?自己看吧,之后在目标目录生成一个名叫test.xsd的文件
3.输入命令 xjc D:\xsdTest\test.xsd -d D:\xsdTest\ -p com.test,之后在目标目录生成一个目录,目录结构为/com/test会为你创建好,在test目录下会生成一个名叫TestList.java的文件和一个ObjectFactory.java文件,这个TestList文件就是我们xml模板所对应的javabean,内容和文章一开始的javabean一模一样
- 使用JAXB时,xml与java对象互转以及初始情况下直接由模板xml生成javabean
- JAXB:xml与java对象互转
- Java Jaxb JavaBean与XML互转
- JAXB JavaBean转xml
- jaxb xml转javaBean
- JAXB 初识(由XML转换为JavaBean) Unmarshaller 的使用
- JAXB完成XML与Java对象的互转
- JAXB完成XML与Java对象的互转
- JAXB完成XML与Java对象的互转
- 使用JAXB类库实现XML与JAVA对象的互转
- Java对象与XML文件互转的几个小技巧(使用jaxb工具类)
- Java JAXB 生成xml
- 使用JAXB类库实现JAVA对象与XML互转
- 使用jaxb使得java对象与xml之间相互转化
- JAXB生成xml及转化javaBean
- JAXB实现xml与java对象的
- 【Java】JAXB 处理 复杂XML 与JavaBean 互相转化过程
- [Java]XML与JAXB
- Gameloft通过玩家邀请机制获得爆发式下载
- 几年前的今天,Google发了这几篇“大”新闻……
- 移动应用设计:综述、导航和浏览
- 今天下午3:30免费课程 | App推广内容政策及商店排名常见问题
- 原生快捷广告可以放视频了!
- 使用JAXB时,xml与java对象互转以及初始情况下直接由模板xml生成javabean
- 3月31日下午3:30免费课程 | App推广内容政策及商店排名常见问题
- Google 翻译更新了
- 重要通知 | “Google软件开发代理商计划”中国地区正式开启报名
- Android O开发者预览版终于推出啦!官方介绍新特性
- Chrome 58测试版发布,有哪些新特性?
- HDU 6127 Hard challenge(计算几何)
- WTM女性开发者大会上海站 正在直播中……
- LinkedIn如何打造成功应用?