java xml转map 高级版
?
?
?
?xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <root> <classs> <id>001</id> <name>st001</name> <student> <id>0001</id> <name> <first>xue</first> <last>bo</last> </name> </student> </classs> <classs> <id>001</id> <name>st001</name> <student> <id>0001</id> <name> <first>xue</first> <last>bo</last> </name> </student> </classs> </root>
?用上一篇文章中的工具转换后,再转成json的结构如下:
?
{ "classs": [ { "id": { "id": "001" }, "student": { "id": { "id": "0001" }, "name": { "last": { "last": "bo" }, "first": { "first": "xue" } } }, "name": { "name": "st001" } }, { "id": { "id": "001" }, "student": { "id": { "id": "0001" }, "name": { "last": { "last": "bo" }, "first": { "first": "xue" } } }, "name": { "name": "st001" } } ] }
?本文用最新的代码实现新的转换使结果更加理想。
代码如下:
package com.xue.tools; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import net.sf.json.JSONObject; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Namespace; import org.dom4j.QName; import com.xue.tools.text.MyTextUtil; public class Test2 { public static void main(String[] args) throws UnsupportedEncodingException, DocumentException { String textFromFile = MyTextUtil.getTextFromFile(new File("src/tt.xml")); Document doc = DocumentHelper.parseText(textFromFile); Map<String, Object> map = (Map<String, Object>) xml2map(doc.getRootElement()); System.out.println(JSONObject.fromObject(map)); } private static Object xml2map(Element element) { System.out.println(element); Map<String, Object> map = new HashMap<String, Object>(); List<Element> elements = element.elements(); if (elements.size() == 0) { map.put(element.getName(), element.getText()); if (!element.isRootElement()) { return element.getText(); } } else if (elements.size() == 1) { map.put(elements.get(0).getName(), xml2map(elements.get(0))); } else if (elements.size() > 1) { // 多个子节点的话就得考虑list的情况了,比如多个子节点有节点名称相同的 // 构造一个map用来去重 Map<String, Element> tempMap = new HashMap<String, Element>(); for (Element ele : elements) { tempMap.put(ele.getName(), ele); } Set<String> keySet = tempMap.keySet(); for (String string : keySet) { Namespace namespace = tempMap.get(string).getNamespace(); List<Element> elements2 = element.elements(new QName(string, namespace)); // 如果同名的数目大于1则表示要构建list if (elements2.size() > 1) { List<Object> list = new ArrayList<Object>(); for (Element ele : elements2) { list.add(xml2map(ele)); } map.put(string, list); } else { // 同名的数量不大于1则直接递归去 map.put(string, xml2map(elements2.get(0))); } } } return map; } }
?
结果如下:
{ "classs": [ { "id": "001", "student": { "id": "0001", "name": { "last": "bo", "first": "xue" } }, "name": "st001" }, { "id": "001", "student": { "id": "0001", "name": { "last": "bo", "first": "xue" } }, "name": "st001" } ] }
?
?
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。