Dom4j读取大部分XML例子

来源:互联网 发布:中国银联财务待遇 知乎 编辑:程序博客网 时间:2024/06/03 18:53
这两天自己在家闲着,写了一个基于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>();//用来保存标签组的ListtagGroup(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 blocke.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====1S_IDNUM====440105178415789543N_STATUS====4S_ORDERNO====10002011133697N_CREDTYPE====1-------------------------------attProperty===={S_ORDERNO={name=t1}}N_TOTAL====2S_IDNUM====87373354360N_STATUS====5S_ORDERNO====10002011133667N_CREDTYPE====3


里面的dispersion=true时结果如下

 

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


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

说明就先写到这里。

具体的源码大家可以到

http://download.csdn.net/detail/steryzone/4024226
下载

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

 

原创粉丝点击