天天看点

java xml 递归_JAVA 递归解析xml

在日常开发中经常碰到xml解析,现提供递归解析xml类以供参考

package cn.sunmeng;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStreamReader;

import java.io.StringReader;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

public class ParseXML {

private static final List ARRAY_PROPERTY = Arrays.asList(new String[]{"CustList","SMCust"});

private Map parserXml(String xml) throws Exception {

StringReader reader = new StringReader(xml);

// 创建一个新的SAXBuilder

SAXReader sb = new SAXReader();

//

Map result = new HashMap();

//

try {

// 通过输入源构造一个Document

Document doc = sb.read(reader);

// 取的根元素

Element root = doc.getRootElement();

List children = root.elements();

//解析xml

result = toMap(children,null);

} catch (Exception e) {

System.err.print(e.getMessage());

throw e;

} finally {

if(reader != null) {

reader.close();

}

}

return result;

}

private Map toMap(List elements,List> list){

//

Element el = null;

String name = "";

//

Map map = new HashMap();

//

for(int i=0; i

el = (Element) elements.get(i);

name = el.getName();

//如果是定义成数组

if(ARRAY_PROPERTY.contains(name)) {

//继续递归循环

List> sublist = new ArrayList>();

//

Map subMap = this.toMap(el.elements(),sublist);

//根据key获取是否已经存在

Object object = map.get(name);

//如果存在,合并

if(object !=null ){

List> olist = (List>)object;

olist.add(subMap);//

map.put(name, olist);

}else{//否则直接存入map

map.put(name, sublist);

}

}else {//单个值存入map

map.put(name,el.getTextTrim());

}

}

//存入list中

if(list!=null)

list.add(map);

//返回结果集合

return map;

}

private static String readXML() throws Exception{

//

StringBuilder sb = new StringBuilder();

//

File file = new File("E:\\xml.txt");

//

if(file.exists() && file.isFile()){

InputStreamReader rd = new InputStreamReader(new FileInputStream(file), "UTF-8");

BufferedReader bufferedReader = new BufferedReader(rd);

String str="";

while((str = bufferedReader.readLine()) != null){

sb.append(str);

}

rd.close();

}

//

return sb.toString();

}

public static void main(String[] args) {

//实例化对象

ParseXML parseXML = new ParseXML();

//获取xml

String xml = new String();

try {

xml = parseXML.readXML();

//解析xml

Map result = parseXML.parserXml(xml);

//打印输出

System.out.println(result);

} catch (Exception e) {

//

System.err.print(e.getMessage());

}

}

}

解析结果:

{

CustList=[

{

FName=SMFromUserName,

MType=SMMsgType,

TName=SMToUserName,

MId=SMMsgId1234567890123456,

Content=SMContent,

Code=00,

SrcLabel=SMSrcLabel,

CTime=SMCreateTime1348831860

},

{

FName=2SMFromUserName,

MType=2SMMsgType,

TName=2SMToUserName,

SMCust=[

{

SM1=sm1val,

SM2=sm2val

},

{

SM1=sm3val,

SM2=sm4val

}

],

MId=2SMMsgId1234567890123456,

Content=2SMContent,

Code=200,

SrcLabel=2SMSrcLabel,

CTime=2SMCreateTime1348831860

}

],

Content=Success,

Code=1200

}