欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA 解析 XML 转 Map

程序员文章站 2022-05-19 15:36:38
...

自定义 XML
先弄个简单的 doc 解析 xml 数据

<WinResponse>
    <RowItem>
       <patientid>1007</patientid>
    </RowItem>
</WinResponse>
import java.io.File;

import javax.xml.parsers.DocumentBuilder;   
import javax.xml.parsers.DocumentBuilderFactory;   
  
import org.w3c.dom.Document;   
import org.w3c.dom.NodeList;   

/** 
* @author  作者 : 小布
* @version 创建时间 : 2019年5月29日 下午4:56:18 
* @explain 类说明 : 
*/
public class AnalysisXML {

	public static void readXMLToData() {
		try {
			 File f = new File("D:\\Mars\\Commonly\\Wechar_info\\WeChat Files\\x1355605391\\FileStorage\\File\\2019-05\\JB01.xml");   
		     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();   
		     DocumentBuilder builder = factory.newDocumentBuilder();   
		     Document doc = builder.parse(f);   
		     NodeList nl = doc.getElementsByTagName("RowItem");   
		     for (int i = 0; i < nl.getLength(); i++) {   
		         System.out.println(doc.getElementsByTagName("patientid").item(i).getFirstChild().getNodeValue());   
		      }
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
}

然后 弄个 xml 转 map

import java.io.File;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
 
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/** 
* @author  作者 : 小布
* @version 创建时间 : 2019年5月29日 下午6:05:45 
* @explain 类说明 : 
*/
public class XMLToMap {

	public static Map mainMethod(String filepath) {
		Map<String, Object> map_finall = new LinkedHashMap<String, Object>();
		try {
			File file = new File(filepath);
			// 读取xml文件,封装为doc对象
			SAXReader saxreader = new SAXReader();
			Document doc = saxreader.read(file);
			Element rootElement = doc.getRootElement();
			// 调用递归方法
			map_finall.put(rootElement.getName(), DiGui(rootElement));
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map_finall;
	}
 
	public static Map DiGui(Element rootElement) {
		// 对节点进行判断
		int flag = hasGradeChrid(rootElement);
		// 存储本层的map,采用LinkedHashMap,保证的顺序
		Map<String, Object> map_this = new LinkedHashMap<String, Object>();
		// 存储子节点的map,采用LinkedHashMap,保证的顺序
		Map<String, Object> map_children = new LinkedHashMap<String, Object>();
		// 获取节点迭代器
		Iterator<Element> iterator = rootElement.elementIterator();
		if (flag == 0) {// 说明该节点所有子节点均有子节点,进入递归
			int num = 0;
			while (iterator.hasNext()) {// 依次继续对节点进行操作
				Element childelement = iterator.next();
				map_children = DiGui(childelement);
				map_this.put(childelement.getName() + "_" + num, map_children);
				num++;
			}
		}
		if (flag == 1) {// 说明该节点的所有子节点均无子节点,封装数据
			while (iterator.hasNext()) {
				Element childelement = iterator.next();
				map_this.put(childelement.getName(),
						(String) childelement.getData());
			}
		}
		if (flag == 2) {// 说明了该节点的子节点有些拥有子节点,有些不拥有
			int nodes = rootElement.elements().size();// 获取子节点个数
			while (nodes >= 1) {
				nodes--;
				int num = 0;//为了让循环重复的节点,避免了key的冲突
				Element element = iterator.next();
				flag = hasGradeChrid(element);//对节点进行判断
				if (flag == 1) {                          //对于子节点,如果只是普通的子节点,那么直接将数进行封装
					// 封装如map,String,String
					map_this.put(element.getName(), element.getData());
				}
				else{                                     //非普通子节点,那么进行递归
					map_children = DiGui(element);
					map_this.put(element.getName() + "_" + num, map_children);//为了让循环重复的节点,避免了key的冲突
				}
			}
		}
		return map_this;
	}
 
	/**
	 * 用于判断该节点的类型 0:说明该节点所有子节点均有子节点 1:说明该节点的所有子节点均无子节点 2:说明了该节点的子节点有些拥有子节点,有些不拥有
	 * 
	 * @param rootelement
	 * @return
	 */
	public static int hasGradeChrid(Element rootelement) {
		int flag = 1;// 初始为1,用与处理对没有子节点的节点进行判断
		StringBuffer flag_arr = new StringBuffer();
		Iterator<Element> iterator = rootelement.elementIterator();
		while (iterator.hasNext()) {
			Element element = iterator.next();// 获取入参rootelement节点的子节点
			// Iterator<Element> iterator_chirld = element.elementIterator();
			if (element.elements().size() > 0) {// 判断是否有子节点
				flag_arr.append("0");
			} else {
				flag_arr.append("1");
			}
		}
		// 如果只包含0,说明该节点所有子节点均有子节点
		if (flag_arr.toString().contains("0")) {
			flag = 0;
		}
		// 如果只包含1,说明该节点的所有子节点均无子节点
		if (flag_arr.toString().contains("1")) {
			flag = 1;
		}
		// 如果同时包含了,0,1,说明了该节点的子节点有些拥有子节点,有些不拥有
		if (flag_arr.toString().contains("0")
				&& flag_arr.toString().contains("1")) {
			flag = 2;
		}
		return flag;
	}

}

测试类:

	@Test
	public void test2() {
		//AnalysisXML.readXMLToData();
		String filepath = "D:\\Mars\\Commonly\\Wechar_info\\WeChat Files\\x1355605391\\FileStorage\\File\\2019-05\\JB01.xml";
		Map map = XMLToMap.mainMethod(filepath);
		System.out.println(map);
	}