java xml转map map转xml 带属性

package xml2map;

 

import java.io.File;

import java.io.IOException;

import java.io.StringWriter;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

 

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.io.OutputFormat;

import org.dom4j.io.XMLWriter;

 

/**

 * xml转map,map转xml 带属性 

 */

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

public class XmlUtil {

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

Map<String, Object> map = xml2map(textFromFile, false);

// long begin = System.currentTimeMillis();

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

// map = (Map<String, Object>) xml2mapWithAttr(doc.getRootElement());

// }

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

JSON json = JSONObject.fromObject(map);

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

Document doc = map2xml(map, "root");

//Document doc = map2xml(map); //map中含有根节点的键

System.out.println(formatXml(doc));

}

/**

 * xml转map 不带属性

 * @param xmlStr

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

 * @return

 * @throws DocumentException

 */

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

Document doc = DocumentHelper.parseText(xmlStr);

Element root = doc.getRootElement();

Map<String, Object> map = (Map<String, Object>) xml2map(root);

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

return map;

}

if(needRootKey){

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

Map<String, Object> rootMap = new HashMap<String, Object>();

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

return rootMap;

}

return map;

}

 

/**

 * xml转map 带属性

 * @param xmlStr

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

 * @return

 * @throws DocumentException

 */

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

Document doc = DocumentHelper.parseText(xmlStr);

Element root = doc.getRootElement();

Map<String, Object> map = (Map<String, Object>) xml2mapWithAttr(root);

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

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

}

if(needRootKey){

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

Map<String, Object> rootMap = new HashMap<String, Object>();

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

return rootMap;

}

return map;

}

 

/**

 * xml转map 不带属性

 * @param e

 * @return

 */

private static Map xml2map(Element e) {

Map map = new LinkedHashMap();

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 = xml2map(iter);

if (map.get(iter.getName()) != null) {

Object obj = map.get(iter.getName());

if (!(obj instanceof List)) {

mapList = new ArrayList();

mapList.add(obj);

mapList.add(m);

}

if (obj instanceof List) {

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 instanceof List)) {

mapList = new ArrayList();

mapList.add(obj);

mapList.add(iter.getText());

}

if (obj instanceof List) {

mapList = (List) obj;

mapList.add(iter.getText());

}

map.put(iter.getName(), mapList);

} else

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

}

}

} else

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

return map;

}

 

/**

 * xml转map 带属性

 * @param e

 * @return

 */

private static Map xml2mapWithAttr(Element element) {

Map<String, Object> map = new LinkedHashMap<String, Object>();

 

List<Element> list = element.elements();

List<Attribute> listAttr0 = element.attributes(); // 当前节点的所有属性的list

for (Attribute attr : listAttr0) {

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

}

if (list.size() > 0) {

 

for (int i = 0; i < list.size(); i++) {

Element iter = list.get(i);

List mapList = new ArrayList();

 

if (iter.elements().size() > 0) {

Map m = xml2mapWithAttr(iter);

if (map.get(iter.getName()) != null) {

Object obj = map.get(iter.getName());

if (!(obj instanceof List)) {

mapList = new ArrayList();

mapList.add(obj);

mapList.add(m);

}

if (obj instanceof List) {

mapList = (List) obj;

mapList.add(m);

}

map.put(iter.getName(), mapList);

} else

map.put(iter.getName(), m);

} else {

 

List<Attribute> listAttr = iter.attributes(); // 当前节点的所有属性的list

Map<String, Object> attrMap = null;

boolean hasAttributes = false;

if (listAttr.size() > 0) {

hasAttributes = true;

attrMap = new LinkedHashMap<String, Object>();

for (Attribute attr : listAttr) {

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

}

}

 

if (map.get(iter.getName()) != null) {

Object obj = map.get(iter.getName());

if (!(obj instanceof List)) {

mapList = new ArrayList();

mapList.add(obj);

// mapList.add(iter.getText());

if (hasAttributes) {

attrMap.put("#text", iter.getText());

mapList.add(attrMap);

} else {

mapList.add(iter.getText());

}

}

if (obj instanceof List) {

mapList = (List) obj;

// mapList.add(iter.getText());

if (hasAttributes) {

attrMap.put("#text", iter.getText());

mapList.add(attrMap);

} else {

mapList.add(iter.getText());

}

}

map.put(iter.getName(), mapList);

} else {

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

if (hasAttributes) {

attrMap.put("#text", iter.getText());

map.put(iter.getName(), attrMap);

} else {

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

}

}

}

}

} else {

// 根节点的

if (listAttr0.size() > 0) {

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

} else {

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

}

}

return map;

}

/**

 * map转xml map中没有根节点的键

 * @param map

 * @param rootName

 * @throws DocumentException

 * @throws IOException

 */

public static Document map2xml(Map<String, Object> map, String rootName) throws DocumentException, IOException  {

Document doc = DocumentHelper.createDocument();

        Element root = DocumentHelper.createElement(rootName);

        doc.add(root);

        map2xml(map, root);

        //System.out.println(doc.asXML());

        //System.out.println(formatXml(doc));

        return doc;

}

/**

 * map转xml map中含有根节点的键

 * @param map

 * @throws DocumentException

 * @throws IOException

 */

public static Document map2xml(Map<String, Object> map) throws DocumentException, IOException  {

Iterator<Map.Entry<String, Object>> entries = map.entrySet().iterator();

if(entries.hasNext()){ //获取第一个键创建根节点

Map.Entry<String, Object> entry = entries.next();

Document doc = DocumentHelper.createDocument();

        Element root = DocumentHelper.createElement(entry.getKey());

        doc.add(root);

        map2xml((Map)entry.getValue(), root);

        //System.out.println(doc.asXML());

        //System.out.println(formatXml(doc));

        return doc;

}

return null;

}

/**

 * map转xml

 * @param map

 * @param body xml元素

 * @return

 */

private static Element map2xml(Map<String, Object> map, Element body) {

Iterator<Map.Entry<String, Object>> entries = map.entrySet().iterator();

while (entries.hasNext()) {

Map.Entry<String, Object> entry = entries.next();

String key = entry.getKey();

Object value = entry.getValue();

if(key.startsWith("@")){ //属性

body.addAttribute(key.substring(1, key.length()), value.toString());

} else if(key.equals("#text")){ //有属性时的文本

body.setText(value.toString());

} else {

if(value instanceof java.util.List ){

List list = (List)value;

Object obj;

for(int i=0; i<list.size(); i++){

obj = list.get(i);

//list里是map或String,不会存在list里直接是list的,

if(obj instanceof java.util.Map){

Element subElement = body.addElement(key);

map2xml((Map)list.get(i), subElement);

} else {

body.addElement(key).setText((String)list.get(i));

}

}

} else if(value instanceof java.util.Map ){

Element subElement = body.addElement(key);

map2xml((Map)value, subElement);

} else {

body.addElement(key).setText(value.toString());

}

}

//System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());

}

return body;

}

/**

 * 格式化输出xml

 * @param xmlStr

 * @return

 * @throws DocumentException

 * @throws IOException

 */

public static String formatXml(String xmlStr) throws DocumentException, IOException  {

Document document = DocumentHelper.parseText(xmlStr);

return formatXml(document);

}

/**

 * 格式化输出xml

 * @param document

 * @return

 * @throws DocumentException

 * @throws IOException

 */

public static String formatXml(Document document) throws DocumentException, IOException  {

// 格式化输出格式

OutputFormat format = OutputFormat.createPrettyPrint();

//format.setEncoding("UTF-8");

StringWriter writer = new StringWriter();

// 格式化输出流

XMLWriter xmlWriter = new XMLWriter(writer, format);

// 将document写入到输出流

xmlWriter.write(document);

xmlWriter.close();

return writer.toString();

}

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值