Dom4j读取大部分XML例子

本文分享了一个使用Dom4j解析XML文件的Java程序示例。程序支持两种模式:一种是将XML中的标签组数据作为对象存储在List中;另一种是将所有数据保存在一个List中,相同数据会覆盖。文章提供了详细的代码实现,并介绍了如何处理重复标签组和属性。
这两天自己在家闲着,写了一个基于Dom4j来读取XML的程序

这个程序之所以被我发上来是想跟大家分享下,更是想抛砖引玉,希望高手们能指导下。。。

功能描述:

从XML中读取所有的信息,通过参数来控制读取的方式(方式一是,将XML里面中标签组的数据作为一个对象(每个组的标签为对象的一个属性,类似于平时我们从数据库里读取数据得到的一个列表数据一样),保存到List里面;方式二:将XML里面的数据全部都保存到一个List里面,相同的覆盖。

 

程序大概的流程是:

1.首先从根目录节点开始遍历读数据

2.通过一个递归来将所有的节点都保存到数组里面(List)

3.如果存在标签组,就分析XML的结构将标签组的的头标签找到

4.然后通过递归来解析整个XML,将标签组的数据作为一个对象保存

 

首先,这个类是需要以下几个jar包

dom4j-1.6.1.jar

jaxen-1.1.1.jar

 

然后就是一个简单的XML 

<?xml version="1.0" encoding="UTF-8"?>
<req>
	<testid name="kk" id="99">999</testid>
	<testname name="tt">蝇</testname>
	<datalist>
		<subdata>
			<S_ORDERNO name="t2">10002011133697</S_ORDERNO>
			<N_CREDTYPE>1</N_CREDTYPE>
			<S_IDNUM>440105178415789543</S_IDNUM>
			<N_TOTAL>1</N_TOTAL>
			<N_STATUS>4</N_STATUS>
		</subdata>
		<subdata>
			<S_ORDERNO name="t1">10002011133667</S_ORDERNO>
			<N_CREDTYPE>3</N_CREDTYPE>
			<S_IDNUM>87373354360</S_IDNUM>
			<N_TOTAL>2</N_TOTAL>
			<N_STATUS>5</N_STATUS>
		</subdata>
	</datalist>
</req>


public List<Map<Object, Object>> ReadRequestXmlForList(String xResultStr) {
		List<Map<Object, Object>> l_trnList = new ArrayList<Map<Object, Object>>();
		SAXReader saxreader = new SAXReader();
		/*根目录*/
		String xPath = "";
		/*重复组的头标签*/
		String s_parentName = "";
		try {
			Document doc = DocumentHelper.parseText(xResultStr);
			//获取根节点
			xPath = doc.getRootElement().getName();
			System.out.println("根节点标签:"+xPath);
			// 获取按照指定搜索路径得到的元素列表
			List result = doc.selectNodes(xPath);
			// 遍历所得元素
			Iterator iter = result.iterator();
			while (iter.hasNext()) {
				// 获得具体的根节点下的元素
				Element element = (Element) iter.next();
				Map<Object, Object> dynaMap = new HashMap<Object, Object>();
				l_trnList.add(dynaMap);
				List<String> tagList = new ArrayList<String>();//用来保存标签组的List
				tagGroup(element,tagList);//将所有节点保存到tagList里面
				if(isFalg)s_parentName = findParentTag(tagList);//解析,得到标签头节点,如上图XML,则这里得到的是“subdata”
				getNextList(element, isFalg, l_trnList, s_parentName, xPath);//全文解析,isFalg代表是否支持组分离,l_trnList用来存放结果的List
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if(dispersion)dispersionMainInfo(l_trnList);
		return l_trnList;
	}


private void getNextList(Element e_element, boolean isFlag,
			List<Map<Object, Object>> list, String s_parentName, String xPath) {
		Iterator iterator = e_element.elementIterator();
		while (iterator.hasNext()) {
			Element element = (Element) iterator.next();
			if (element.getName().equals(s_parentName)) {
				Map<Object, Object> curr_DynaMap = new HashMap<Object, Object>();
				list.add(curr_DynaMap);
			}
			//如果上一级是根节点,就保存到列表第一位	
			if (element.getParent().getName().equals(xPath)) {
				list.get(0).put(element.getName(),
						element.getText());
			}
			//当需要循环时进行如下操作
			if (isFlag && !element.elementIterator().hasNext()&&!element.getParent().getName().equals(xPath)) {
				list.get(list.size() - 1).put(element.getName(),
						element.getText());				
			}
			//不需要循环时进行如下操作
			if (!isFlag && !element.elementIterator().hasNext()&&!element.getParent().getName().equals(xPath)) {
				list.get(list.size() - 1).put(element.getName(),element.getText());				
			}
			//如果该节点存在属性值,会在该对象中生成一个attProperty(Map<String,Map>)的属性来存放该节点下的属性

			findNoteProperty(element,list);
			
			getNextList(element, isFlag, list, s_parentName, xPath);
		}
	}


上面是一个递归的解析XML的代码

如上面给出的XML,解析后的结果为:

PS:if(dispersion)dispersionMainInfo(l_trnList);里面的dispersion=false时结果如下

共用时间:140ms
-------------------------------
testname====蝇
attProperty===={testname={name=tt}, testid={id=99, name=kk}}
datalist====
testid====999
-------------------------------
attProperty===={S_ORDERNO={name=t2}}
N_TOTAL====1
S_IDNUM====440105178415789543
N_STATUS====4
S_ORDERNO====10002011133697
N_CREDTYPE====1
-------------------------------
attProperty===={S_ORDERNO={name=t1}}
N_TOTAL====2
S_IDNUM====87373354360
N_STATUS====5
S_ORDERNO====10002011133667
N_CREDTYPE====3


里面的dispersion=true时结果如下

 

共用时间:125ms
-------------------------------
testname====蝇
attProperty===={testname={name=tt}, S_ORDERNO={name=t1}, testid={id=99, name=kk}}
datalist====
N_TOTAL====1
S_IDNUM====440105178415789543
N_STATUS====4
S_ORDERNO====10002011133697
testid====999
N_CREDTYPE====1
-------------------------------
testname====蝇
attProperty===={testname={name=tt}, S_ORDERNO={name=t1}, testid={id=99, name=kk}}
datalist====
N_TOTAL====2
S_IDNUM====87373354360
N_STATUS====5
S_ORDERNO====10002011133667
testid====999
N_CREDTYPE====3


参数值dispersion是控制是否将共有的信息合并到每一个对象中。

说明就先写到这里。

具体的源码大家可以到

http://download.youkuaiyun.com/detail/steryzone/4024226
下载

如果有什么可以留言或者发邮件,henry.lee104@gmail.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值