java xml转map_java xml转map 带属性(方式2)

该博客介绍了如何使用Java的Dom4j库将XML字符串转换为Map,并且保留元素属性。提供了两种方法,一种不包含属性,另一种包含属性。转换过程中处理了元素的递归遍历和列表构建,确保了数据结构的正确映射。此外,还展示了将转换后的Map转为JSON的示例。
摘要由CSDN通过智能技术生成

java xml转map map转xml 带属性(这个效率更好)

参考效果:xml转json

java xml转map

package xml2map;

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

import java.util.Set;

import net.sf.json.JSON;

import net.sf.json.JSONObject;

import org.apache.commons.io.FileUtils;

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.Namespace;

import org.dom4j.QName;

/**

* xml转map,带属性 http://happyqing.iteye.com/blog/2317570

*

* @author happyqing

* @since 2016.8.8

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

public class XmlUtil2 {

public static void main(String[] args) throws DocumentException, IOException {

String textFromFile = FileUtils.readFileToString(new File("D:/workspace/workspace_3.7/xml2map/src/xml2json/sample.xml"),"UTF-8");

//Document doc = DocumentHelper.parseText(textFromFile);

//Map map = (Map) xmlToMapWithAttr(doc.getRootElement());

Map map = xmlToMap(textFromFile, false);

// long begin = System.currentTimeMillis();

// for(int i=0; i<1000; i++){

// map = (Map) xml2mapWithAttr(doc.getRootElement());

// }

// System.out.println("耗时:"+(System.currentTimeMillis()-begin));

JSON json = JSONObject.fromObject(map);

System.out.println(json.toString(1)); // 格式化输出

}

/**

* xml转map 不带属性

* @param xmlStr

* @param needRootKey 是否需要在返回的map里加根节点键

* @return

* @throws DocumentException

*/

public static Map xmlToMap(String xmlStr, boolean needRootKey) throws DocumentException {

Document doc = DocumentHelper.parseText(xmlStr);

Element root = doc.getRootElement();

Map map = (Map) xmlToMap(root);

if(root.elements().size()==0 && root.attributes().size()==0){

return map;

}

if(needRootKey){

//在返回的map里加根节点键(如果需要)

Map rootMap = new HashMap();

rootMap.put(root.getName(), map);

return rootMap;

}

return map;

}

/**

* xml转map 带属性

* @param xmlStr

* @param needRootKey 是否需要在返回的map里加根节点键

* @return

* @throws DocumentException

*/

public static Map xmlToMapWithAttr(String xmlStr, boolean needRootKey) throws DocumentException {

Document doc = DocumentHelper.parseText(xmlStr);

Element root = doc.getRootElement();

Map map = (Map) xmlToMapWithAttr(root);

if(root.elements().size()==0 && root.attributes().size()==0){

return map; //根节点只有一个文本内容

}

if(needRootKey){

//在返回的map里加根节点键(如果需要)

Map rootMap = new HashMap();

rootMap.put(root.getName(), map);

return rootMap;

}

return map;

}

/**

* xml转map 不带属性

* @param element

* @return

*/

private static Object xmlToMap(Element element) {

// System.out.println(element.getName());

Map map = new LinkedHashMap();

List 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(), xmlToMap(elements.get(0)));

} else if (elements.size() > 1) {

// 多个子节点的话就得考虑list的情况了,比如多个子节点有节点名称相同的

// 构造一个map用来去重

Map tempMap = new LinkedHashMap();

for (Element ele : elements) {

tempMap.put(ele.getName(), ele);

}

Set keySet = tempMap.keySet();

for (String string : keySet) {

Namespace namespace = tempMap.get(string).getNamespace();

List elements2 = element.elements(new QName(string,

namespace));

// 如果同名的数目大于1则表示要构建list

if (elements2.size() > 1) {

List list = new ArrayList();

for (Element ele : elements2) {

list.add(xmlToMap(ele));

}

map.put(string, list);

} else {

// 同名的数量不大于1则直接递归去

map.put(string, xmlToMap(elements2.get(0)));

}

}

}

return map;

}

/**

* xml转map 带属性

* @param element

* @return

*/

private static Object xmlToMapWithAttr(Element element) {

// System.out.println(element.getName());

Map map = new LinkedHashMap();

List elements = element.elements();

List listAttr = element.attributes(); // 当前节点的所有属性的list

boolean hasAttributes = false;

for (Attribute attr : listAttr) {

hasAttributes = true;

map.put("@" + attr.getName(), attr.getValue());

}

if (elements.size() == 0) {

// map.put(element.getName(), element.getText());

if (hasAttributes) {

map.put("#text", element.getText());

} else {

map.put(element.getName(), element.getText());

}

if (!element.isRootElement()) {

// return element.getText();

if (!hasAttributes) {

return element.getText();

}

}

} else if (elements.size() == 1) {

map.put(elements.get(0).getName(),

xmlToMapWithAttr(elements.get(0)));

} else if (elements.size() > 1) {

// 多个子节点的话就得考虑list的情况了,比如多个子节点有节点名称相同的

// 构造一个map用来去重

Map tempMap = new LinkedHashMap();

for (Element ele : elements) {

tempMap.put(ele.getName(), ele);

}

Set keySet = tempMap.keySet();

for (String string : keySet) {

Namespace namespace = tempMap.get(string).getNamespace();

List elements2 = element.elements(new QName(string,

namespace));

// 如果同名的数目大于1则表示要构建list

if (elements2.size() > 1) {

List list = new ArrayList();

for (Element ele : elements2) {

list.add(xmlToMapWithAttr(ele));

}

map.put(string, list);

} else {

// 同名的数量不大于1则直接递归去

map.put(string, xmlToMapWithAttr(elements2.get(0)));

}

}

}

return map;

}

}

参考:

Java xml文件转换为map集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值