大家在解析大量相似xml文件的时候是否会遇到这样一个问题:冗余的代码去set定义的实体对象Bean的值,基本都是一样的操作
而且毫无任何代码价值可言所以在这写了一个简单的例子,类封装了几个方法你只需传入xml文件,或者URL路径。和Bean.Class 类名
即可自动传回你需要的List集合。
需要解析的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<messages>
<resultCode>0</resultCode>
<totalCount>2</totalCount>
<UserLists>
<UserList>
<userId>0</userId>
<loginName>张三0</loginName>
<email>qsina0@sina.com</email>
<userType>1</userType>
<status>1</status>
<roleType>1</roleType>
<registerIP>192.168.1.0</registerIP>
<registerTime>2012-06-07 15:35:33</registerTime>
</UserList>
<UserList>
<userId>1</userId>
<loginName>张三1</loginName>
<email>qsina1@sina.com</email>
<userType>1</userType>
<status>1</status>
<roleType>1</roleType>
<registerIP>192.168.1.1</registerIP>
<registerTime>2012-06-07 15:35:33</registerTime>
</UserList>
</UserLists>
</messages>
在进行相关操作中需要如下包:
下面是贴出的代码:
package com.jeecms.common.util;
import java.lang.reflect.Field;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XmlParseUtil {
/**
* 反射设置实体不同类型字段的值 <暂时只支持 日期 字符串 boolean Integer值设置 待扩建>
*
* @param field
* @param obj
* @param value
* @throws Exception
*/
public static void convertValue(Field field, Object obj, String value)
throws Exception {
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (field.getGenericType().toString().equals("class java.lang.Integer")) {
field.set(obj, Integer.parseInt(value));
} else if (field.getGenericType().toString().equals("boolean")) {
field.set(obj, Boolean.parseBoolean(value));
} else if (field.getGenericType().toString().equals(
"class java.util.Date")) {
field.set(obj, sim.parse(value));
} else {
field.set(obj, value);
}
}
/**
* 解析xml文件返回保存cls的List集合,如果返回码resultCode=1时则返回List为null
*
* @param xml
* @param cls
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static List<?> parseXml2List(String xml, Class<?> cls)
throws Exception {
List<Object> lists = null;
Document doc = DocumentHelper.parseText(xml);
Element et = doc.getRootElement();
String root = et.getName();
// 查看返回码是否为真.
List<Element> list = doc.selectNodes("//" + root + "/resultCode");
if (!list.isEmpty() && list.size() > 0) {
Element element = list.get(0);
String returnResult = element.getText();
if (returnResult.equals("0")) {
List<Element> father = doc.selectNodes("//" + root + "/"+ cls.getSimpleName()+"s");
//判断对象父节点是否有包含数据
if(father!=null&&!father.isEmpty()&&father.size()==1){
List<Element> userLists = father.get(0).elements();
if (userLists!=null&&!list.isEmpty()) {
lists = new ArrayList<Object>();
for (Element e : userLists) {
List<Element> li = e.elements();
Class<?> cl = (Class<?>) Class.forName(cls.getName());
Object ob = cl.newInstance();
for (Element element2 : li) {
String name = element2.getName();
String value = element2.getText();
Field field = ob.getClass().getDeclaredField(name);
field.setAccessible(true);
convertValue(field, ob, value);
}
lists.add(ob);
}
}
}
}
}
return lists;
}
/**
* 解析xml文件返回保存cls的List集合,如果返回码resultCode=1时则返回List为null
*
* @param url
* @param cls
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static List<?> parseXml2List(URL url, Class<?> cls)
throws Exception {
List<Object> lists = null;
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(url);
Element et = doc.getRootElement();
String root = et.getName();
// 查看返回码是否为真.
List<Element> list = doc.selectNodes("//" + root + "/resultCode");
if (!list.isEmpty() && list.size() > 0) {
Element element = list.get(0);
String returnResult = element.getText();
if (returnResult.equals("0")) {
List<Element> father = doc.selectNodes("//" + root + "/"+ cls.getSimpleName()+"s");
//判断对象父节点是否有包含数据
if(father!=null&&!father.isEmpty()&&father.size()==1){
List<Element> userLists = father.get(0).elements();
if (userLists!=null&&!list.isEmpty()) {
lists = new ArrayList<Object>();
for (Element e : userLists) {
List<Element> li = e.elements();
Class<?> cl = (Class<?>) Class.forName(cls.getName());
Object ob = cl.newInstance();
for (Element element2 : li) {
String name = element2.getName();
String value = element2.getText();
Field field = ob.getClass().getDeclaredField(name);
field.setAccessible(true);
convertValue(field, ob, value);
}
lists.add(ob);
}
}
}
}
}
return lists;
}
/**
* 解析xml文件返回保存Map的集合,map中可能包含key值为returnCode、desc、totalCount等单字段.
* 也可能包含存储对象为List<cls>的集合值.
* 获取List值key cls_List
* @param requestPath
* @param cls
* @return map
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static Map<String, Object> parseXml2Map(String requestPath,
Class<?> cls) throws Exception {
Map<String, Object> maps = new HashMap<String, Object>();
List<Object> lists = new ArrayList<Object>();
SAXReader saxReader = new SAXReader();
//Document doc = saxReader.read(new File(requestPath));
Document doc = saxReader.read(new URL(requestPath));
Element et = doc.getRootElement();
// 标记List是否为空
// boolean bool = true ;
// 根节点名字
List<Element> rList = et.elements();
for (Element element : rList) {
List<Element> rLists = element.elements();
if (!rLists.isEmpty() && rLists.size() > 0) {
//bool = false;
// 判断二级节点
for (Element e : rLists) {
List<Element> li = e.elements();
Class<?> cl = (Class<?>) Class.forName(cls.getName());
Object ob = cl.newInstance();
for (Element element2 : li) {
String name = element2.getName();
String value = element2.getText();
Field field = ob.getClass().getDeclaredField(name);
field.setAccessible(true);
convertValue(field, ob, value);
}
lists.add(ob);
}
} else {
maps.put(element.getName(), element.getText());
}
maps.put(cls.getSimpleName() + "_List", lists);
}
return maps;
}
/**
* 只获取返回码0为保存成功(true)1为保存失败(false)
*/
@SuppressWarnings("unchecked")
public static boolean parseXmlReturnCode(String xml) {
boolean bool = false;
try {
Document doc = DocumentHelper.parseText(xml);
Element et = doc.getRootElement();
String root = et.getName();
// 查看返回码是否为真.
List<Element> list = doc.selectNodes("//" + root + "/resultCode");
if (!list.isEmpty() && list.size() > 0) {
Element element = list.get(0);
String returnResult = element.getText();
if (returnResult.equals("0")) {
bool = true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return bool;
}
}
- 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】
一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...
- 用DOM4J解析XML文件案例
用DOM4J解析XML文件案例,由于DOM4J不像JAXP属于JAVASE里,所以如果要使用DOM4J,则必须额外引入jar包,如图:
- 使用DOM4J解析XMl文件与读取XML文件
XML文件 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id ...
- Dom4j解析Xml文件,Dom4j创建Xml文件
Dom4j解析Xml文件,Dom4j创建Xml文件 >>>>>>>>>>>>>>>>>>&g ...
- Java进阶(二十七)使用Dom4j解析XML文件
使用Dom4j解析XML文件 写在前面的话 由于论文实验要求,需要实现操作XML文档,为此想到了dom4j这个工具,使用之后深感受益.在此分享给大家,以此共勉. 注:本文转载自http://blog. ...
- 使用dom4j 解析xml文件
//使用dom4j 解析xml文件,升级版,dom4j是对dom的封装 //重点 package com.offcn.utils; import java.io.File; import java.i ...
- dom4j 解析XML文件
<?xml version="1.0" encoding="UTF-8"?> <!-- 手机的根节点 --> <Phones> ...
- 用dom4j解析xml文件并执行增删改查操作
转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...
- 【java项目实战】dom4j解析xml文件,连接Oracle数据库
简单介绍 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方.我们还是看一下官方给出的解释.例如以下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT ...
随机推荐
- AIX网络性能优化简介
在AIX 中,网络性能的优化可从以下几方面进行: 网络内存(network memory)的调整 socket 缓冲区 (socket buffer) 的调整 网络接口(network interfa ...
- CMMI整体理解
CMMI的目的,一是质量,二是时间表,三是最低的成本:我的理解就是即以最低的成本,在既定的时间表要求下,达到相应的质量水平. CMMI是什么?我的理解是,CMMI并不是一个过程说明书,它不是告诉我们怎 ...
- 【原】java环境变量配置&& jdk配置 && 各配置的意义
本配置需要新建JAVA_HOME和classpath两个: JAVA_HOME 指明JDK安装路径.(在安装好java之后就该配置) classpath 为java加载类(class or lib)路 ...
- Postman-简单使用
Postman-简单使用 Postman-进阶使用 Postman-CI集成Jenkins Postman功能(https://www.getpostman.com/features) 主要用于模拟网 ...
- 关于Guid
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- Shiro-多Realm验证
1.多Realm验证 存在这样一种场景,同一个密码可能在MqSQL中存储,也可能在Oracle中存储,有可能MqSQL中使用的是MD5加密算法,而Oracle使用SHA1加密算法.这就需要有多个Rea ...
- elixir 高可用系列(四) Task
概述 之前学习的 Agent,GenSever以及GenEvent,都是用来管理状态或者处理消息的. 但是在很多时候,我们需要的是执行某个任务,这时如果使用 GenSever 或者 GenEvent, ...
- Connect教程系列--响应式布局(一)
微软终于跨平台了,最近在第九频道(Event-Visual Studio)下面出来一系列关于vs2015的视频,介绍vs2015以及.NET5.0的新特性等,现针对其讲解的.NET和ASP.NET,进 ...
- 使用ODP.NET查询数据参数顺序问题及莫名ORA-01722错误提示
最近由于项目需要,必须使用C#配合Oracle来进行开发,在开发的过程中,发现有些查询无法正确获取数据.例如: Select * From tabParam Where ParamCode = :Pa ...
- (转)【ASP.NET Web API】Authentication with OWIN
概述 本文说明了如何使用 OWIN 来实现 ASP.NET Web API 的验证功能,以及在客户端与服务器的交互过程中,避免重复提交用户名和密码的机制. 客户端可以分为两类: JavaScript: ...