java非闭合xml转对象,不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller
摘要:将XML文档与JAVA对象互转是很常见的需求,如果XML定义很规整这很好实现。然而在现实中“不规矩”的XML可能更常见,Marshaller便无能为力了吗?下面是一个小技巧,调整一下思维便能重用Marshaller了,征服它们使工作更简单。
关键词:Marshaller,JAVA,XML
将一个类生成一个Json字符串、将一个Json字符串翻译成一个类(JAVA、C#代码),这一过程已经在“”博客中描述了;在实际项目应用中,如何将一个类生成一个XML文档或XML字符串,如何将一个XML文档翻译成一个类,这又是经常遇到的问题。比如,跟其它系统的交互中,其它系统定义的接口参数以XML格式定义,那么你写的系统就要解析并理解它传入的数据,或者把自己内部的数据转成按它规定的XML格式文档传出。在JAVA里,这一过程还蛮简单,使用Marshaller便可以很轻松的解决。
然而,有一些“不守规矩”的XML格式可能被其它系统定义了,它们定义的XML格式恰恰不是Marshaller天生有能力生成与解析的,我们对这种“不规矩"的XML就无计可施了吗?其实Marshaller还是很好用的,后来你会发现Marshaller的极限便不复存在。下面,我以一个简单的例子来证明我的这一观点,对于“不规矩”的XML我也是有办法将其制服的。
一、XML帮助类
首先,你得有一个XML帮助类,它提供的是最基础的,使用Marshaller使XML和JAVA对象互转,这对于规矩的XML文档们,便能以一挡百了。
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
/**
* XML的帮助类
*
* @author wanganqi
* @version v1.0
* @since 2014年8月13日下午2:38:52
*/
public class XmlHelper
{
/**
* 将自定义数据对象转化为XML字符串
*
* @param clazz 自定义数据类型
* @param object 自定义数据对象
* @return XML字符串
* @throws JAXBException 异常
*/
public static String objectToXML(Class clazz,Object object)
throws JAXBException
{
String xml = null;
JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
Writer w = new StringWriter();
m.marshal(object,w);
xml = w.toString();
return xml;
}
/**
* 将XML字符串转化为自定义数据对象
*
* @param clazz 自定义数据类型
* @param xml XML字符串
* @return 自定义数据对象
* @throws JAXBException 异常
*/
public static Object xmlToObject(Class clazz,String xml)
throws JAXBException
{
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller um = context.createUnmarshaller();
return um.unmarshal(new StringReader(xml));
}
}
这对于这样规矩的:XML,就要定义这样的:JAVA类,一一对应,什么事情都能解决。
XML(规矩的)文件格式样例JAVA生成方法
2
YYYY-MM-DD HH:MM:SS
王安琪No1
00001
00002
00003
ANQIHead head = new ANQIHead(1,"YYYY-MM-DD HH:MM:SS","王安琪No1");
ANQIBody body = new ANQIBody("00001","00002","00003");
ANQIFile anqiFile = new ANQIFile(head,body);
String xml = XmlHelper.objectToXML(ANQIFile.class,anqiFile);
补充说明:
下面的构造函数都隐去了,使用 String... anqis类似的参数,使用时请不要疑惑。
@XmlRootElement(name = "ANQIFILE")
@XmlType(propOrder = { "head","body" })
public class ANQIFile
{
private ANQIHead head;
private ANQIBody body;
@XmlElement(name = "HEAD")
public ANQIHead getHead()
{
return head;
}
public void setHead(ANQIHead head)
{
this.head = head;
}
@XmlElement(name = "BODY")
public ANQIBody getBody()
{
return body;
}
public void setBody(ANQIBody body)
{
this.body = body;
}
}
-------------------------------------------------------------------------------------
public class ANQIBody
{
private List anqi;
@XmlElement(name = "ANQI")
public List getAnqi()
{
return anqi;
}
public void setAnqi(List anqi)
{
this.anqi = anqi;
}
}
@XmlType(propOrder = { "anqiNum","dateTime","appovalNum" })
public class ANQIHead
{
private int anqiNum;
private String dateTime;
private String appovalNum;
@XmlElement(name = "ANQINUM")
public int getAnqiNum()
{
return clueNum;
}
public void setAnqiNum(int clueNum)
{
this.clueNum = clueNum;
}
@XmlElement(name = "DATETIME")
public String getDateTime()
{
return dateTime;
}
public void setDateTime(String dateTime)
{
this.dateTime = dateTime;
}
@XmlElement(name = "APPROVALNUM")
public String getAppovalNum()
{
return appovalNum;
}
public void setAppovalNum(String appovalNum)
{
this.appovalNum = appovalNum;
}
}
补充说明:
这里的构造函数都隐去了,使用 String... anqis类似的参数,使用时请不要疑惑。
二、将 自定义数据对象 与 XML(不规矩的)字符串 互转
现在我们有一个需求,把我们系统的JAVA对象转成按其它系统规定的XML格式文档传出,其它系统给了我们一份XML格式文档,希望我们能正确构造它;我写的系统要解析并理解其它系统传入的XML数据,同样的其它系统给了我们一份XML格式文档,希望我们能顺利解释它。看看我们是怎么做的吧。
XML格式:
XML(不规矩的)文件格式样例JAVA使用方法 及 JAVA类
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
可以使用与上面规矩的XML类似的JAVA定义、使用方法。
现在看看它有多不规矩(其实也不是很不规矩啦,只是在ANQI这个节点下面的子节点名字每个都不一样,但都是以ITEM开头的)。
要生成这样的XML,可以先用ObjectToXML()生成都是以 ITEM 命名的节点,再通过DOM读取并更新ITEM名称,后面加上1、2...
要解析这样的XML,可以先把此XML过滤一遍,把ITEM*样的节点名称更新为 ITEM,再用XMLToObject()生成对象。
三、遇到的问题及改进方法
1、在使用Marshaller的过程中,出现了一点问题:生成XML时,并不按照配置的@XmlType(propOrder = { "1","2" })的顺序,而是恰好相反的,这个问题目前还没有解决,唯一在网上查到的相关信息是说JAVA版本为6以下的会有这个BUG,但是我的JAVA版本为1.7,也出现了这个问题,望有知道解决方法的同学告知一下,请不吝赐教。
2、对于不规矩的XML格式,更好的办法是使用Marshaller所支持的自定义解析器,上面的不规矩XML完全可以映射到Map对象上面去。这种方法更能支持更不规则的XML定义。网上不知有无已经实现的代码,知道的同学,请不吝赐教。
最近项目工作量很大,每天都能学习到很多东西,项目管理的、JAVA使用的、界面规范的......不胜枚举,毕竟是第一次自己负责的项目,经验和教训肯定的巨大的。
作为一个项目经理,对作品、对自己的团队都觉得立马有了深深的责任感,也有了很大的压力,感谢组织的信任与支持,感谢团队的鼎力协作,感谢相关部门的大力配合,感谢姚老师的无私帮助,也感谢老婆默默的支持。
java非闭合xml转对象,不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller相关推荐
- 为什么word中插入对象会自动关闭word_你常常忽视的Word文本操作小技巧
很多人在运用word时候,会遇到一些绊脚石,小编这里整理了大家经常忽略的8个word操作小技巧.别客气,我是活雷锋!页眉页脚一.怎样让word中每一页用不同的页眉?整个文档只能用相同的页眉,一改就 ...
- 我的世界java版控制键_我的世界:教你几个实用的快捷键小技巧,萌新可能对此一无所知!...
#我的世界# 作为一位经常打字的作者,CTRL+C(复制)和CTRL+V(粘贴)是用得最为频繁的(当然伪萌新可不是搬运工,纯原创!). 想要让打字变得更快,用好键盘快捷键是非常必要的!游戏也是如此!掌 ...
- java excel 合并两个单元格内容 无法换行_12个简单高效的EXCEL小技巧,让你秒变职场达人!...
小伙伴们早上好,今天小编和大家分享一组简单高效的Excel小技巧,点滴积累,也能提高办公效率哦. 1.填充合并单元格 在工作表中尽量不使用合并单元格,否则就是重复工作量.那么对已有合并单元格的工作表, ...
- java实现对象转换为map、xml字符串转化为map、map转化为xml字符串
全栈工程师开发手册 (作者:栾鹏) java教程全解 java实现map使用功能函数:对象转换为map.xml字符串转化为map 1.将对象的所有属性转化为map键值对 2.转换对象为map,并忽略某 ...
- java静态方法和非静态方法的区别_史上最全阿里 Java 面试题总结
关注[ToBeTopJavaer],回复[答案],获取全套面试题答案,为明年的金三银四,做好充分的准备. JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节. String类能被继承吗 ...
- java对象流保存表格,序列化表格 (Java 2 Platform SE 5.0)
此字段有两种可能的解释: startMode == DOW_IN_MONTH startDay 指示夏令时是在 startMonth 月份中的哪个日期开始的,该日期可以是从 1 到 28.30 或 3 ...
- java映射文件是哪一种xml_java解析xml的几种方式哪种最好?
满意答案 gjek59ug 2013.10.10 采纳率:52% 等级:12 已帮助:9223人 (1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组 ...
- php xml对象解析_php解析xml 的四种简单方法(附实例)
XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...
- java 遍历xml子节点,Axiom解析XML,axiomxml,1、遍历XML全部节点,
Axiom解析XML,axiomxml,1.遍历XML全部节点, 1.遍历XML全部节点,将节点放入Map返回2.遍历XML当前父节点下的所有子节点 [Java]代码import java.util. ...
最新文章
- SAP HANA中的存储过程(sql procedure)
- shell字符串截取总结
- 不疯狂的外星人,已疯狂的资本
- OpenCASCADE:Open CASCADE Application Framework (OCAF)的简介
- boost::python模块使用通用函数或 ufunc 的示例
- java 封装 继承 堕胎_Java的继承、封装和多态
- C语言程序项目计划书,(C语言程序设计课程设计计划书.doc
- STM32系列芯片名称定义
- python 正则表达式 速查表
- 大学c语言如何自学,大学c语言的学习方法指导
- 短视频代运营服务内容
- 呕心沥血大放血,今天小企鹅来给大家送福利了!!!Mac.Win.Lin虚拟机映像/资源超全[分享]
- 自然语言处理--keras实现一维卷积网络对IMDB 电影评论数据集构建情感分类器
- NYOJ239 月老的难题 二分图最大匹配(前向星)
- Linux CFS调度
- 【AR or VR】浅谈AR和VR的优劣
- TCP可靠传输及流量控制系列五:TCP流量控制基本算法
- guava中ImmutableMap使用示例及好处
- 将维基百科导入图形数据库的方法和步骤
- 《Python Web开发实战》踩地雷记17/3/27
热门文章
- windows系统关闭指定的端口
- 编程教育机构测试题(2)
- vue {{}} 大胡子表达式里面可以写些什么
- 确保安全的HTTPS
- 英派斯智能产品齐聚中国体博会,全民健身迎接智能化时代
- oracle 字符串分割成数组_oracle根据分隔符将字符串分割成数组函数
- dw中怎么设置站点服务器,如何在 Dreamweaver 中设置测试服务器
- Spring中的循环依赖解决详解
- Javascript清除所有的cookie
- 在项目中使用 vuepress 搭建组件文档 报错 Uncaught ReferenceError: global is not defined