不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller
|
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 version="1.0" encoding="UTF-8"?>
<ANQIFILE>
<HEAD>
<ANQINUM>2</ANQINUM>
<DATETIME>YYYY-MM-DD HH:MM:SS</DATETIME>
<APPROVALNUM>王安琪No1</APPROVALNUM>
</HEAD>
<BODY>
<ANQI>00001</ANQI>
<ANQI>00002</ANQI>
<ANQI>00003</ANQI>
</BODY>
</ANQIFILE>
|
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); 补充说明: |
|
@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<String> anqi;
@XmlElement(name = "ANQI")
public List<String> getAnqi()
{
return anqi;
}
public void setAnqi(List<String> 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使用方法 及 JAVA类 |
|
<?xml version="1.0" encoding="UTF-8"?>
<ANGELFILE>
<ANGEL>
<WANG ID="00001" COUNT="2">
<ANQI>
<ITEM1>VALUE</ITEM1>
<ITEM2>VALUE</ITEM2>
<ITEMN>VALUE</ITEMN>
</ANQI>
<ANQI>
<ITEM1>VALUE</ITEM1>
<ITEM2>VALUE</ITEM2>
<ITEMN>VALUE</ITEMN>
</ANQI>
</WANG>
</ANGEL>
</ANGELFILE> |
可以使用与上面规矩的XML类似的JAVA定义、使用方法。
现在看看它有多不规矩(其实也不是很不规矩啦,只是在ANQI这个节点下面的子节点名字每个都不一样,但都是以ITEM开头的)。
要生成这样的XML,可以先用ObjectToXML()生成都是以 ITEM 命名的节点,再通过DOM读取并更新ITEM名称,后面加上1、2...
要解析这样的XML,可以先把此XML过滤一遍,把ITEM*样的节点名称更新为 ITEM,再用XMLToObject()生成对象。
|

2、对于不规矩的XML格式,更好的办法是使用Marshaller所支持的自定义解析器,上面的不规矩XML完全可以映射到Map对象上面去。这种方法更能支持更不规则的XML定义。网上不知有无已经实现的代码,知道的同学,请不吝赐教。
最近项目工作量很大,每天都能学习到很多东西,项目管理的、JAVA使用的、界面规范的......不胜枚举,毕竟是第一次自己负责的项目,经验和教训肯定的巨大的。
作为一个项目经理,对作品、对自己的团队都觉得立马有了深深的责任感,也有了很大的压力,感谢组织的信任与支持,感谢团队的鼎力协作,感谢相关部门的大力配合,感谢姚老师的无私帮助,也感谢老婆默默的支持。
ありがとうございます

如何集中资源做成一个优秀的项目,如何担当得起自己的责任,如何与各类角色沟通,真是任重而道远。
不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller的更多相关文章
- 使用XStream是实现XML与Java对象的转换(6)--持久化
九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...
- 使用XStream是实现XML与Java对象的转换(4)--转换器
七.转换器(Converter) 我们程序中的POJO是千变万化的,而且需求也是千奇百怪的,所以XStream中的内置的转换器的功能不一定能够满足我们的要求,所以我们就需要自己构建转换器. 1,一个基 ...
- 使用XStream是实现XML与Java对象的转换(3)--注解
六.使用注解(Annotation) 总是使用XStream对象的别名方法和注册转换器,会让人感到非常的乏味,又会产生很多重复性代码,于是我们可以使用注解的方式来配置要序列化的POJO对象. 1,最基 ...
- 使用XStream是实现XML与Java对象的转换(1)--简介及入门示例
一.简单介绍 XStream是thoughtworks开发的开源框架,用于实现XML数据于Java对象.Json数据的转换.它不需要schema或其他的mapping文件就可以进行java对象和xml ...
- 使用XStream是实现XML与Java对象的转换(5)--Object Stream
八,Object Stream 之前的例子我们都是直接输出Xml成为String类型或者从String中获得并解析Xml,现在我们要处理输入流和输出流! 1,输出流(ObjectOutputStrea ...
- 使用XStream是实现XML与Java对象的转换(2)--别名
五.使用别名(Alias) 首先,有这样一段Java代码: import java.util.ArrayList; import java.util.List; import com.thoughtw ...
- XML 和 java对象相互转换
XML 和 java对象相互转换 博客分类: XML 和 JSON 下面使用的是JDK自带的类,没有引用任何第三方jar包. Unmarshaller 类使客户端应用程序能够将 XML 数据转换为 ...
- XStream轻松转换xml和java对象
首先引入所需的jar: xstream-1.4.9.xpp3_min-1.1.4c.dom4j-1.6.1, 或用maven管理jar包时在pom.xml中添加: <!-- https://mv ...
- Java&Xml教程(十一)JAXB实现XML与Java对象转换
JAXB是Java Architecture for XML Binding的缩写,用于在Java类与XML之间建立映射,能够帮助开发者很方便的將XML和Java对象进行相互转换. 本文以一个简单的例 ...
随机推荐
- Android Studio修改程序包名
我也是在网上看到的,并且这个方法只能这么修改:cn.example.xxx修改为cn.example.yyy ,修改到根目录下... refactor---rename修改 然后clean,buil ...
- 45 Useful Oracle Queries--ref
http://viralpatel.net/blogs/useful-oracle-queries/ Here’s a list of 40+ Useful Oracle queries that e ...
- WINDOWS安装mysql5.7.20
MSI安装包链接 http://pan.baidu.com/s/1mhI0SMO 提取密码 gaqu 安装前要把老版本的MYSQL卸载干净 之前用官网的archive免安装版安装一直失败,放弃,用MS ...
- extern、 const、static的理解
1.extern:是一个声明,用来告诉编译器其它文件中存在这个变量,可以拿到使用.是文件级的 2.static: 是一个文件内的声明,只能在本文件内使用,是文件中的(函数级的) 3.const ...
- leetcode_787【K 站中转内最便宜的航班】
有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 ...
- What is the difference between modified duration, effective duration and duration?
Macaulay Duration (traditionally just called Duration) The formula usually used to calculate a bond' ...
- C#把大写英文变成小写英文,把小写英文变成大写英文
static void Main(string[] args) { string s; // 声明一个变量,来接受用户输入的值. Console.WriteLine("请输入一个字符串:& ...
- 智能提示含查询多列(html+JS+handler+ HttpRemoting)二、Remoting代码
/// <summary> /// 智能查询类型 /// </summary> public enum QueryType : byte { /// <summary&g ...
- 子级用css float浮动 而父级不能自适应高度解决方法
解决子级对象使用css float浮动 而父级div不能自适应高度,不能被父级内容撑开解决方法,父级div没有高度解决方法. 当在对象内的盒子使用了float后,导致对象本身不能被撑开自适应高度,这个 ...
- 深入理解javascript中的Function.prototye.bind
函数绑定(Function binding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其 ...