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;

/**

* @ClassName: ParseXML

* @Description: 递归解析xml

* @author: SM(sm0210@qq.com)

*

*

* <?xml version="1.0" encoding="UTF-8"?>

SMToUserName

SMFromUserName

SMCreateTime1348831860

SMMsgType

SMContent

SMMsgId1234567890123456

SMSrcLabel

00

2SMToUserName

2SMFromUserName

2SMCreateTime1348831860

2SMMsgType

2SMContent

2SMMsgId1234567890123456

2SMSrcLabel

200

sm1val

sm2val

sm3val

sm4val

1200

Success

*

*/

public class ParseXML {

/**

* @FieldName: ARRAY_PROPERTY

* @FieldType: 数组节点

* @Description: 数组节点

*/

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

/**

*

* @param xml

* @param config

* @return

* @throws Exception

*/

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;

}

/**

* 递归解析xml,实现N层解析

* @param xml

*/

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;

}

/**

* 读取文本文件里的xml

* @return

* @throws Exception

*/

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();

}

/**

* main 方法

* @param args

*/

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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值