XStream解析XML文本并用反射机制转换为对象
xml文本格式是网络通信中最常用的格式,最近特别研究了一下如何解析xml文本并转换为对象,现在分享一下我最近的学习成果~
先列一下本例中需要解析的xml文本:
<results name="list"> <row pubtime="2016-04-13 16:40:13" author="APP" id="140" title="什么是公告" content="公告,是公开宣告。" /> <row pubtime="2016-04-13 16:36:50" author="网站" id="138" title="12345678" content="12345678" /> <row pubtime="2016-04-06 15:02:44" author="网站" id="134" title="关于网站用户注册流程说明1" content="关于用户注册流程说明" /> <row pubtime="2016-03-30 18:32:13" author="APP" id="126" title="关于网站使用说明" content="测试" /> <row pubtime="2016-03-30 18:29:26" author="网站" id="125" title="关于手机App使用说明" content="123" /> </results>
讲一下我的思路,我选择使用XStream来解析xml文本,因为xstream在转换对象方面会比dom4j更优秀一些,它是通过注解方式来声明对应结点的,在操作上会更直观方便。首先会将整个文本转换成一个Results类对象,而每一个row结点作为一个HashMap放入到Results类对象的List列表中,最后会将每一个HashMap读取出来通过JAVA的反射机制转换为Info对象,并生成List列表。
public class Info { private String id; private String title; private String content; private String author; private String pubtime; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPubtime() { return pubtime; } public void setPubtime(String pubtime) { this.pubtime = pubtime; } @Override public String toString() { return "Info [author=" + author + ", content=" + content + ", id=" + id + ", pubtime=" + pubtime + ", title=" + title + "]"; } }
@XStreamConverter(RowConverter.class) public class Row extends HashMap<String, String> { private static final long serialVersionUID = 5619951409573339302L; }
@XStreamAlias("results") public class Results { @XStreamAlias("name") @XStreamAsAttribute private String name; @XStreamImplicit(itemFieldName = "row") private List<Row> rows; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Row> getRows() { return rows; } public void setRows(List<Row> rows) { this.rows = rows; } }
public class RowConverter extends AbstractCollectionConverter { public RowConverter(Mapper mapper) { super(mapper); // TODO Auto-generated constructor stub } @Override public boolean canConvert(Class arg0) { // TODO Auto-generated method stub return Row.class.equals(arg0); } @Override public void marshal(Object arg0, HierarchicalStreamWriter writer, MarshallingContext arg2) { // TODO Auto-generated method stub Row map = (Row) arg0; for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); writer.addAttribute(entry.getKey().toString(), entry.getValue().toString()); } } @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { // TODO Auto-generated method stub Row map = new Row(); populateMap(reader, context, map); return map; } protected void populateMap(HierarchicalStreamReader reader, UnmarshallingContext context, Row map) { Iterator<String> iterator = reader.getAttributeNames(); while (iterator.hasNext()) { Object key = iterator.next(); String value = reader.getAttribute((String) key); map.put(key.toString(), value.toString()); } } }
RowConverter是一个转换器类,作用是将每一个row结点转变一个HashMap。
测试类:
public class Xstream { private static String xml; public static void main(String[] args) throws Exception{ //初始化 init(); XStream xstream = new XStream(new XppDriver(new XmlFriendlyReplacer("_-", "_"))); //解析xml文本 xstream.processAnnotations(Results.class); Results results = (Results) xstream.fromXML(xml); //将解析出来的Results类对象转化成list列表 List<Info> list = createList(Info.class,results); for(int i=0;i<list.size();i++){ //打印 Info info = list.get(i); System.out.println(info.toString()); } } public static void init(){ //初始化xml文本 xml ="<results name=\"list\"><row pubtime=\"2016-04-13 16:40:13\" author=\"APP\" id=\"140\" title=\"什么是公告\" content=\"公告,是公开宣告。\" /><row pubtime=\"2016-04-13 16:36:50\" author=\"网站\" id=\"138\" title=\"12345678\" content=\"12345678\" /><row pubtime=\"2016-04-06 15:02:44\" author=\"网站\" id=\"134\" title=\"关于网站用户注册流程说明1\" content=\"关于用户注册流程说明\" /><row pubtime=\"2016-03-30 18:32:13\" author=\"APP\" id=\"126\" title=\"关于网站使用说明\" content=\"测试\" /><row pubtime=\"2016-03-30 18:29:26\" author=\"网站\" id=\"125\" title=\"关于手机App使用说明\" content=\"123\" /></results>"; } public static <T> List createList(Class<T> clz ,Results results) throws Exception{ List list = new ArrayList(); for(Row row :results.getRows()){ //根据class和Row生成对象放入list list.add(createObject(clz,row)); } return list; } public static <T> T createObject(Class<T> clazz ,Row row) throws Exception{ //初始化对象 T obj = clazz.newInstance(); //遍历Info类中所有方法 for (Method method : clazz.getDeclaredMethods()) { String methodName = method.getName(); Class[] perams = method.getParameterTypes(); //找到set开头,长度大于3,并且入参数量为1的方法 if (methodName.startsWith("set") && methodName.length() > 3 && perams.length == 1) { String temp = methodName.substring(3, methodName.length()); //拿到属性名称 String fieldName = temp.toLowerCase(); //根据属性名称从HashMap中拿到对应的值 String value = row.get(fieldName); if(value != null){ //拿到该方法入参的Class,根据入参类型来决定调用方法形式 Class paramClass = perams[0]; if (String.class.equals(paramClass)) { method.invoke(obj, value); } else if (Integer.class.equals(paramClass) || int.class.equals(paramClass)) { method.invoke(obj, Integer.valueOf(value)); } else if (Long.class.equals(paramClass) || long.class.equals(paramClass)) { method.invoke(obj, Long.valueOf(value)); } else if (BigDecimal.class.equals(paramClass)) { method.invoke(obj, new BigDecimal(value)); } else if (Boolean.class.equals(paramClass) || boolean.class.equals(paramClass)) { if(value.equals("true")||value.equals("TRUE")) method.invoke(obj, true); if(value.equals("false")||value.equals("FALSE")) method.invoke(obj, false); } } } } return obj; } }
最后是输出效果:
Info [author=APP, content=公告,是公开宣告。, id=140, pubtime=2016-04-13 16:40:13, title=什么是公告] Info [author=网站, content=12345678, id=138, pubtime=2016-04-13 16:36:50, title=12345678] Info [author=网站, content=关于用户注册流程说明, id=134, pubtime=2016-04-06 15:02:44, title=关于网站用户注册流程说明1] Info [author=APP, content=测试, id=126, pubtime=2016-03-30 18:32:13, title=关于网站使用说明] Info [author=网站, content=123, id=125, pubtime=2016-03-30 18:29:26, title=关于手机App使用说明]
相关推荐
首先创建XStream实例,然后使用`toXML()`方法将Java对象转换为XML字符串: ```java XStream xstream = new XStream(); User user = new User(); user.setName("Forest"); user.setAge(30); String xml = xstream.to...
XStream的核心理念是,如果你能打印一个对象,那么也应该能将其转换为XML,反之亦然。 **2. 安装与引入** 要在项目中使用XStream,首先需要添加依赖。如果你的项目是Maven项目,可以在pom.xml文件中添加以下依赖: ...
XStream的核心概念是通过为Java对象定义一个映射,使得对象的字段与XML元素一一对应。这可以通过使用`@XStreamAlias`注解或者在类级别定义`@XStreamConverter`来实现。例如: ```java import ...
然而,处理XML数据时,解析和转换为可操作的对象是一个常见挑战。这时,XStream库就派上了用场。XStream是一个Java库,它能将Java对象序列化为XML,同时也能将XML反序列化为Java对象,极大地简化了XML处理过程。 ...
本篇文章将深入探讨如何使用XStream进行XML到对象的转换,并提供一个实际的案例。 首先,理解XStream的基本工作原理是至关重要的。XStream通过映射XML节点到Java类的字段来实现对象的序列化和反序列化。这意味着你...
反序列化是将 XML 文本转换回 Java 对象的过程: ```java Person deserializedPerson = (Person) xstream.fromXML(xml); ``` **二、XStream 的高级特性** 1. **自定义转换器** XStream 提供了自定义转换器的...
通过这个工程,开发者可以学习并实践XStream的使用,了解XML与Java对象之间的转化机制。同时,由于包含了测试类和所需jar包,可以直接运行和调试,这对于初学者或者需要快速实现XML处理功能的开发者来说,是一个非常...
然后,使用Xstream的`fromXML()`方法解析XML文件为Java对象: ```java Playbill playbill = (Playbill) xstream.fromXML(reader); ``` 解析完成后,我们得到了一个`Playbill`对象,包含XML文件中的所有数据。为了...
Xstream是一款强大的Java库,用于实现Java对象与XML文档之间的转换。这种转换不仅支持基本数据类型,也适用于复杂的数据结构,包括自定义类和集合。Xstream的设计旨在简化序列化过程,使得开发者能够轻松地在Java...
在这个场景中,我们将探讨如何使用XStream将XML文档转换成Java对象,进而转化为JSON对象。 首先,我们需要引入XStream库。XStream的核心功能是能够将Java对象和XML之间的映射自动化,极大地简化了序列化和反序列化...
4. **序列化:** 调用`XStream.toXML()`方法将Java对象转换为XML字符串。 5. **反序列化:** 使用`XStream.fromXML()`方法将XML字符串恢复为Java对象。 6. **安全处理:** 在处理不受信任的XML输入时,应启用...
【标题】:“xStream 实现xml与 java对象的转换...xStream提供了丰富的API和扩展机制,能够满足大部分XML与Java对象转换的需求。记住,始终要根据项目的具体需求进行适当的配置和优化,以确保数据转换的准确性和效率。
4. **反序列化XML为Java对象** 反之,如果有一个XML字符串,你可以将其转换回Java对象: ```java Employee deserializedEmployee = (Employee) xstream.fromXML(xml); System.out.println(deserializedEmployee....
总结起来,Xstream通过注解提供了一种简洁、直观的方式来处理XML和Java对象之间的转换。这种灵活性使得在Java项目中处理XML数据变得更加简单,尤其在需要频繁进行序列化和反序列化的场景下。通过熟练掌握Xstream的...
Xstream的核心理念是通过反射机制自动处理Java对象到XML的转换,同时支持自定义转换规则,以满足复杂的业务需求。 **二、安装与引入** 要在项目中使用Xstream,首先需要将其添加到依赖管理中。如果你的项目是Maven...
在Java编程语言中,XStream库提供了一个简单且强大的机制,用于将Java对象序列化为XML,反之亦然。这使得在存储数据、传输数据或持久化对象时非常方便。本教程将深入探讨XStream库及其在Java中的使用,通过实际的...
在`xmlAnalysis`文件夹中,可能包含了一个简单的Java程序,演示了如何使用DOM、SAX、StAX和XStream解析XML文件,并展示了XStream如何在JavaBean与XML之间进行转换。你可以运行这些代码,观察输出结果,以加深理解。...
xstream方式解析及生成xml文件
在这个版本中,XStream提供了对Java Bean对象转换为XML的全面支持。 **XStream的工作原理:** XStream的核心是基于反射的,它通过分析Java对象的类结构来构建XML表示。它使用了一种称为"alias"的概念,允许我们将...
XStream是一个轻量级、高性能的库,能够将Java对象序列化为XML,同时也能将XML反序列化回Java对象,实现XML和Java对象的互相转换。 首先,我们需要引入XStream库。在给定的描述中提到了两个依赖文件:xstream-1.3.1...