dom4j实现XML与Object互转

最近一个SN供应商融资平台中需要一个XML与Object(主要是HashMap)互转的java类,代码中主要使用了dom4j类库及递归,在这里发出来与大家共享,鄙人原创。

package com.suning.dom4j;

import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;

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;

public class ParseXml {
	private static List elemList = new ArrayList();
	private static HashMap hs = new HashMap();
	private static String listName;
	private static Vector vector = new Vector();
	private static HashMap tesths = new HashMap();
	private static String srcXml = "<root><orderhead><ordercode>450857496</ordercode><ordercode>yangying</ordercode><maker>Haier</maker></orderhead><orderdetails><orderdetail><linenum>10</linenum><productcode>10001</productcode></orderdetail><orderdetail><linenum>20</linenum><productcode>10002</productcode></orderdetail><orderdetail><linenum>30</linenum><productcode>10003</productcode></orderdetail><test>test</test><test>test222</test><test>test333</test></orderdetails></root>";
	public static void main(String args[]) throws DocumentException {
		ParseXml test = new ParseXml();
		Element root = test.getRootElement();
		tesths = test.getObject(root);
		String text = parse(null, tesths, null);
		System.out.println(text);
		System.out.println("-----------解析结果------------");
	}

	/**
	 *   * 获取根元素  
	 */
	public Element getRootElement() throws DocumentException {
		Document srcdoc = DocumentHelper.parseText(srcXml);
		Element elem = srcdoc.getRootElement();
		return elem;
	}


	public HashMap getObject(Element element) {
		List elementlists = element.elements();
		String keyName = element.getName();
		HashMap retHas = new HashMap();
		if (elementlists.size() == 0) {
			// 没有子元素
			retHas.put(element.getQualifiedName(), element.getTextTrim());
			return retHas;
		} else {
			HashMap hs = new HashMap();
			Vector vector = new Vector();
			for (Iterator it = elementlists.iterator(); it.hasNext();) {
				Element elem = (Element) it.next();
				String key = elem.getQualifiedName();
				HashMap tempMap = getObject(elem);
				if (hs.containsKey(key)) {
					HashMap hsclone = (HashMap) hs.clone();
					if (hsclone.get(key) instanceof HashMap) {
						vector.add(hsclone.get(key));
						vector.add(tempMap.get(key));
					} else if (hsclone.get(key) instanceof Vector) {
						vector = (Vector) hsclone.get(key);
						vector.add(tempMap.get(key));
					} else {
						vector.add(hsclone.get(key));
						vector.add(tempMap.get(key));
					}
					Vector vectorclone = (Vector) vector.clone();
					vector.clear();
					hs.put(key, vectorclone);

				} else {
					hs.put(elem.getQualifiedName(), tempMap.get(key));
				}

			}
			retHas.put(keyName, hs);
			return retHas;
		}
	}

	public static String parse(Element element, HashMap data, String nodeName) {
		String key = null;
		Object value = null;
		Document document = null;
		Element child = null;
		if (element == null) {
			document = DocumentHelper.createDocument();
		}
		if ((element == null) && (data == null)) {
			System.out.println("error");
		}
		Iterator iter = data.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry entry = (Map.Entry) iter.next();
			key = (String) entry.getKey();
			value = entry.getValue();
			if (value instanceof Vector) {
				Iterator it = ((Vector) value).iterator();
				while (it.hasNext()) {
					Object HM_val = it.next();
					if (HM_val instanceof HashMap) {
						child = element.addElement(key);
						parse(child != null ? child : element,
								(HashMap) HM_val, key);
					} else {
						child = element.addElement((String) key);
						child.setText((String) HM_val);
					}
				}
			} else if (value instanceof HashMap) {
				if (element == null) {
					element = document.addElement(key);
				} else {
					child = element.addElement(key);
				}

				parse(child != null ? child : element, (HashMap) value, key);
			} else {
				if (element == null) {
					element = document.addElement(key);
					element.setText((String) value);
				} else {
					child = element.addElement(key);
					child.setText((String) value);
				}
			}
		}
		String text = "";
		if (element != null) {
			text = formatXml(element, "GBK", false);

		} else if (document != null) {
			text = formatXml(document.getRootElement(), "GBK", false);
		}
		System.out.println(text);
		return text;
	}

	public static String formatXml(Element document, String charset,
			boolean istrans) {
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding(charset);
		StringWriter sw = new StringWriter();
		XMLWriter xw = new XMLWriter(sw, format);
		xw.setEscapeText(istrans);
		try {
			xw.write(document);
			xw.flush();
			xw.close();
		} catch (IOException e) {
			System.out.println("格式化XML文档发生异常,请检查!");
			e.printStackTrace();
		}
		return sw.toString();
	}

}

1.最后的结果是HashMap

{root={orderdetails={orderdetail=[{productcode=10001, linenum=10}, {productcode=10002, linenum=20}, {productcode=10003, linenum=30}], test=[test, test222, test333]}, orderhead={maker=Haier, ordercode=[450857496, yangying]}}}

2.XML格式是:

 <root>
  <orderdetails>
    <orderdetail>
      <productcode>10001</productcode>
      <linenum>10</linenum>
    </orderdetail>
    <orderdetail>
      <productcode>10002</productcode>
      <linenum>20</linenum>
    </orderdetail>
    <orderdetail>
      <productcode>10003</productcode>
      <linenum>30</linenum>
    </orderdetail>
    <test>test</test>
    <test>test222</test>
    <test>test333</test>
  </orderdetails>
  <orderhead>
    <maker>Haier</maker>
    <ordercode>450857496</ordercode>
    <ordercode>yangying</ordercode>
  </orderhead>
</root>

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值