这个程序之所以被我发上来是想跟大家分享下,更是想抛砖引玉,希望高手们能指导下。。。
功能描述:
从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
本文分享了一个使用Dom4j解析XML文件的Java程序示例。程序支持两种模式:一种是将XML中的标签组数据作为对象存储在List中;另一种是将所有数据保存在一个List中,相同数据会覆盖。文章提供了详细的代码实现,并介绍了如何处理重复标签组和属性。
6690

被折叠的 条评论
为什么被折叠?



