之前开发过一个解析多层级xml文件的工具类,后来处理的时候发现,这种方式得到的map或json集合多一个key标签,在解析的时候会比较麻烦,于是根据需要在原有方法的基础上写出了另外的处理方法,总结记录如下:
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 功能:XML解析工具类
* @author lmb
* @version 1.0
* @date 2017-6-5
*/
public class ParseXMLUtils {
/**
* 将Document对象转为Map(String→Document→Map)
* @param Document
* @return
*/
@SuppressWarnings("rawtypes")
public static Map Dom2Map(Document doc){
Map map = new HashMap();
if(doc == null)
return map;
Element root = doc.getRootElement();
for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {
Element e = (Element) iterator.next();
//System.out.println(e.getName());
List list = e.elements();
if(list.size() > 0){
map.put(e.getName(), Dom2Map(e));
}else
map.put(e.getName(), e.getText());
}
return map;
}
/**
* 将Element对象转为Map(String→Document→Element→Map)
* @param Element
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Map Dom2Map(Element e){
Map map = new HashMap();
List list = e.elements();
if(list.size() > 0){
for (int i = 0;i < list.size(); i++) {
Element iter = (Element) list.get(i);
List mapList = new ArrayList();
if(iter.elements().size() > 0){
Map m = Dom2Map(iter);
if(map.get(iter.getName()) != null){
Object obj = map.get(iter.getName());
if(!obj.getClass().getName().equals("java.util.ArrayList")){
mapList = new ArrayList();
mapList.add(obj);
mapList.add(m);
}
if(obj.getClass().getName().equals("java.util.ArrayList")){
mapList = (List) obj;
mapList.add(m);
}
map.put(iter.getName(), mapList);
}else
map.put(iter.getName(), m);
}
else{
if(map.get(iter.getName()) != null){
Object obj = map.get(iter.getName());
if(!obj.getClass().getName().equals("java.util.ArrayList")){
mapList = new ArrayList();
mapList.add(obj);
mapList.add(iter.getText());
}
if(obj.getClass().getName().equals("java.util.ArrayList")){
mapList = (List) obj;
mapList.add(iter.getText());
}
map.put(iter.getName(), mapList);
}else
map.put(iter.getName(), iter.getText());//公共map resultCode=0
}
}
}else
map.put(e.getName(), e.getText());
return map;
}
public static void main(String[] args) {
String str1 = "" +
" 2 " +
" EUR " +
" 11 " +
" tom " +
" sss " +
" ";
String str2 = "" +
" " +
" 2 " +
" 11 " +
" tom " +
" sss " +
" " +
" " +
" " +
" 7107300212 " +
" 97D2C7D26224A2DAE9A1CB501E60F395 " +
" EUR " +
" zh_CN " +
" " +
" " +
" 2222300212 " +
" 444424A2DAE9A1CB501E60F395 " +
" USA " +
" zh_CN " +
" " +
" " +
"";
SAXReader saxReader = new SAXReader();
Document document;
try {
document = saxReader.read(new ByteArrayInputStream(str1.getBytes()));
Map map = Dom2Map(document);
System.out.println("map>>> " + map);
/*
{DB_ID=EUR, CHANNEL_ID=11, USERNAME=tom, PASSWORD=sss, POOL_ID=2}
{BODY={BUSLIST=[{TRACE_ID=97D2C7D26224A2DAE9A1CB501E60F395, PHONE_NO=7107300212, LANG=zh_CN, TENANT_ID=EUR}, {TRACE_ID=444424A2DAE9A1CB501E60F395, PHONE_NO=2222300212, LANG=zh_CN, TENANT_ID=USA}]}, HEADER={CHANNEL_ID=11, USERNAME=tom, PASSWORD=sss, POOL_ID=2}}
*/
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
在上面方法的基础上又开发出基于地段节点层级关系的多结点多层级xml转平级map的方法:
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.simpleproxy.dataparse.xml.ParseXMLUtils;
/**
* 功能:通过属性文件处理XML报文
* @author lmb
* @version 1.0
* @date 2017-6-5
*/
public class ParseXmlByPropertyFile {
/**
* 将多结点多层级的Map转为多包体的list集合
* @param respStr
* @param listNode
* @return
*/
public static List