java对象与XML相互转化
起因
最近在公司做了一次webservice相关的任务,其中我最敢兴趣的就是webservice接受到XML对应的流以后是如何方便的转化成java对象,而java对象又是如何生成对应的XML的.
目的
这篇文章的目的就是为了记录一下: 当我和别人确定了XML的格式以后怎么最方便的将它映射到java对象上,java对象又如何生成对应的XML报文.
原理
java有XML和JAVA对象相互转化的方法,那就是JAXB.除了jaxb之外开发过程中我还发现了一些小技巧,需要记录一下.
具体
webservice服务之间数据格式如果是XML的话,那么最关键最首先要做的应该是先定下双方的XML的格式.
如果XML已经有了,比如这样:
<person>
<name>abc</name>
<age>24</age>
<computers>
<computer>
<name>p1</name>
<cpu>i3</cpu>
</computer>
<computer>
<name>p2</name>
<cpu>i5</cpu>
</computer>
<computer>
<name>p3</name>
<cpu>i7</cpu>
</computer>
</computers>
</person>
那么我们应该生成他对应的XSD文件.
XSD文件就是校验XML用的,JAXB也需要用他生成java对象.
公司的做法是找个XSD模板,然后改改改.......简单粗暴.....这样的话模板需要和你的结构比较类似,不然改起来会很痛苦,自己写过XSD的朋友应该都深有体会....反正当初我找了个单层的XSD模板,我的报文是3层嵌套的...我改完有N个BUG....各种校验不通过....
其实有很多工具可以生成XSD文件,比如我现在就用XMLSPY

打开前面写的XML报文以后可以自动生成相对应的XSD.
但是自动生成的XSD可能有些地方的校验不是我们想要的,在这个工具里也可以比较方便的去调整,比如

比如computers下的computer这里自动生成的XSD要求是至少1个computer节点,最多无限个.如果我们的业务需求是最少可以没有,最多无限个的话我们可以修改它满足我们的条件(虽然似乎生成的java对象没有什么区别)

然后XSD文档就有了..有了XSD文档以后只要生成利用JAVA自带的XJC生成相应的java对象即可.网上有很多相关命令.
我是自己建一个.cmd文件,然后写入
D:\jet\jdk1.7\jdk-7windows-x64\bin\xjc -d .\ test.xsd
即可.就是XJC的路径,生成java文件目标地址,xsd地址.
然后运行就能生成java对象了.
最后写个测试类来看看好不好用.
package test.jaxb; import java.io.File;
import java.io.IOException;
import java.io.StringWriter; import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller; public class JAXBConverterTest {
public static void main(String[] args) throws IOException, JAXBException {
JAXBContext context = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Object obj = unmarshaller.unmarshal(new File("C:/Users/Administrator/Desktop/jaxb/test.xml"));
System.out.println(obj); System.out.println("======================="); StringWriter sw = new StringWriter();
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(obj, sw);
System.out.println(sw.toString());
}
}
Person [name=abc, age=24, computers=Computers [computer=[Computer [name=p1, cpu=i3], Computer [name=p2, cpu=i5], Computer [name=p3, cpu=i7]]]]
=======================
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><person><name>abc</name><age>24</age><computers><computer><name>p1</name><cpu>i3</cpu></computer><computer><name>p2</name><cpu>i5</cpu></computer><computer><name>p3</name><cpu>i7</cpu></computer></computers></person>
看来效果不错.
小结
webservice开发流程小结:先定下XML报文 -> 利用工具生成XSD -> XJC生成java对象 -> 调用JAXB相关方法转化java对象和XML报文
java对象与XML相互转化的更多相关文章
- 通过JAXB完成Java对象与XML之间的转换
Java对象转换XML的过程叫marshal. XML转换到Java对象的过程叫unmarshal. 一.Java对象转化为XML 这里省略getter和setter方法 通过标注@XMLRootEl ...
- JAVA对象和XML文档、原来他们之间还有这一出
最近项目开发中遇到一个问题,访问接口不再通过url地址请求的方式,而是 通过socket发送xml格式的报文到指定服务器来进行信息的统一认证.. 因此组装xml格式的报文字符串以及解析服务器返回的xm ...
- 玩转Java对象和XML相互转换
最近在项目中一直出现Java对象和XML之间的相互转换,一开始由于项目很庞大,我又是临时调度过去,导致在按照项目组长的要求进行写代码的同时,总是在这块云里雾里,最近才慢慢开始搞清楚项目中具体的使用缘由 ...
- java对象与xml相互转换 ---- xstream
XStream是一个Java对象和XML相互转换的工具,很好很强大.提供了所有的基础类型.数组.集合等类型直接转换的支持. XStream中的核心类就是XStream类,一般来说,熟悉这个类基本就够用 ...
- 使用XStream注解实现Java对象与XML互相转换的代码示例
本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例. 我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件.如:jdom.dom4j等 ...
- java socket报文通信(三)java对象和xml格式文件的相互转换
前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...
- JAXB 实现java对象与xml之间互相转换
首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...
- JAXB实现java对象与xml之间转换
JAXB简介: 1.JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标 ...
- jaxb 专题一(JAXB 实现java对象与xml之间互相转换)
首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...
随机推荐
- json的理解及读取
一: JSON 语法是 JavaScript 对象表示语法的子集,其语法规则如下: 数据在键值对中 数据由逗号分隔 花括号保存对象:{} 方括号保存数组:[] 如:[{"name" ...
- Drop all the tables, stored procedures, triggers, constraints and all the dependencies in one SQL statement
Is there any way in which I can clean a database in SQl Server 2005 by dropping all the tables and d ...
- CSS3:RGBA的使用方法
1.说明 此色彩模式与RGB相同,只是在RGB模式上新增了Alpha透明度. RGBA(R,G,B,A) 2.取值 R: 红色值,正整数值的取值范围为:0 - 255,百分数值的取值范围为:0.0% ...
- ERROR: Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' 问题的解决
今天继续作大死,趟php7的配置的坑. 照例,安装了昨天的各种扩展之后,解压php7的压缩文件到 /usr/local/. 然后开始配置config的扩展: ./configure --prefix= ...
- jedisLock—redis分布式锁实现
一.使用分布式锁要满足的几个条件: 系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现) 共享资源(各个系统访问同一个资源,资源的载体 ...
- Android Studio导入github下载的project和module
前言:我们以前eclispe时代, 经常都是跑到github浏览第三方开源资源,然后下载下来,运行一下sample之类的,学习没有接触的第三方安卓库,但是到了Android Studio,在githu ...
- 使用JavaMail发送邮件
一.邮件的相关概念 邮件协议.主要包括: SMTP协议:Simple Mail Transfer Protocol,即简单邮件传输协议,用于发送电子邮件 POP3协议:Post Office Prot ...
- [LeetCode] Wildcard Matching 外卡匹配
Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...
- EF使用CodeFirst方式生成数据库&技巧经验
前言 EF已经发布很久了,也有越来越多的人在使用EF.如果你已经能够非常熟练的使用EF的功能,那么就不需要看了.本文意在将自己使用EF的方式记录下来备忘,也是为了给刚刚入门的同学一些指导.看完此文,你 ...
- 基于C/S架构的3D对战网络游戏C++框架_【不定期更新通知】
由于笔者最近有比赛项目要赶,这个基于C/S架构的3D对战网络游戏C++框架也遇到了一点瓶颈需要点时间沉淀,所以近一段时间不能保证每天更新了,会保持不定期更新.同时近期笔者也会多分享一些已经做过学过的C ...