`
yy19870101
  • 浏览: 7868 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

dom4j实现XML与Object互转

XML 
阅读更多

最近一个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>

 

分享到:
评论
1 楼 清晨迎朝阳 2015-05-27  
楼猪,你确定你实现互转了?

相关推荐

    Dom4J生成XML的完整方法希望大家能用到

    Dom4J(Document Object Model for Java)是一款开源的、轻量级的Java库,用于处理XML文档。它提供了一套灵活且强大的API,使得开发者可以轻松地创建、读取、修改和输出XML数据。Dom4J的核心类`Document`代表整个XML...

    使用dom4j将xml字符串转换成Bean对象

    当我们需要将XML字符串解析并映射到Java Bean对象时,dom4j是一个常用的库。本篇文章将详细探讨如何使用dom4j库实现这个过程。 首先,dom4j是一个强大的Java XML API,它提供了丰富的功能,如读取、写入、修改和...

    使用Maven管理项目,实现DOM4j操作XML文件

    DOM4j则是一个强大的Java库,用于处理XML文档,提供了丰富的API来实现XML的读取、写入、修改等操作。在这个示例中,我们将深入探讨如何利用Maven管理和DOM4j来操作XML文件。 首先,让我们了解一下Maven。Maven是...

    dom4j解析XML所需jar包

    6. **XPath和XSLT转换**:除了基本的XML操作,DOM4J还能配合XPath执行XSLT(eXtensible Stylesheet Language Transformations)转换,实现XML到XML或XML到其他格式(如HTML)的转换。 7. **JAXB集成**:虽然DOM4J...

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    DOM4J的名字来源于“Document Object Model for Java”,它采用面向对象的设计思想,提供了对XML文档的全面支持。 DOM4J库的核心功能包括: 1. **解析XML**:DOM4J可以读取XML文件,将其转换为一个树形结构,即...

    dom4j解析xml实例

    **DOM4J解析XML实例详解** 在Java编程中,处理XML文档是一项常见的任务。DOM4J是一个非常流行的、强大的Java XML API,它提供了灵活且高效的方式来解析、创建、修改XML文档。本文将深入探讨如何使用DOM4J进行XML...

    java xml和map互转

    总结,使用DOM4J库,我们可以方便地在Java中实现XML与Map之间的互转。这不仅适用于简单的键值对,还支持嵌套结构、属性以及有无根节点的情况。在实际项目中,可以根据具体需求对这些方法进行适当的调整和优化。

    dom4j解析xml

    DOM4J是基于DOM(Document Object Model)的,但它通过提供更高级别的API来简化XML操作,使得开发者可以更方便地处理XML结构。 **DOM4J的核心概念** 1. **Element**: 在DOM4J中,`Element`是XML文档中最基本的结构...

    dom4j操作XMl例子

    DOM4J采用Document Object Model (DOM)接口,但它的实现比标准DOM更快,占用内存更少。DOM4J的核心类包括`Document`、`Element`、`Attribute`和`Namespace`等,它们分别代表XML文档、元素、属性和命名空间。 在`dom...

    dom4j_XML.rar_DOM4J_dom4j xml java_java xml_读写xml

    5. **DOM4J与JAXB(Java Architecture for XML Binding)对比**:虽然两者都可以处理XML,但DOM4J更侧重于底层的XML操作,而JAXB则用于将Java对象和XML之间进行自动转换,更适用于对象和XML映射的需求。 6. **示例...

    dom4j-jar与dom4j解析xml文档介绍

    "dom4j-jar与dom4j解析xml文档介绍" 这个标题告诉我们,我们将探讨的是一个关于dom4j库的jar文件,以及如何使用这个库来解析XML文档。dom4j是一个Java库,它提供了丰富的API用于处理XML、HTML和DOM文档。这里的"jar...

    Dom4j-XML.rar_dom4j xml

    与DOM(Document Object Model)相比,DOM4J更轻量级,内存占用少,且操作XML更加直观。接下来,我们将探讨如何使用DOM4J进行XML的创建和解析。 **一、创建XML文件** 1. 引入DOM4J库:在Java项目中,你需要添加DOM...

    dom4j解析XML所需要的jar包

    然而,DOM4J并不是Java内置的DOM实现,而是基于SAX(Simple API for XML)和DOM的混合模型,这使得它在性能和易用性之间找到了平衡。DOM4J通过提供一种更符合Java习惯的对象模型,使得开发者可以更自然地操作XML文档...

    dom4j_XML.rar_DOM4J_dom4j xml

    DOM4J是Java中解析XML的常用库之一,其名称中的“DOM”指的是Document Object Model,这是一个W3C标准,用于表示XML文档的树型结构。DOM4J不仅支持DOM,还提供了SAX(Simple API for XML)和StAX(Streaming API for...

    DOM4J 读取xml字符串

    与传统的 DOM API 相比,DOM4J 提供了更友好的 API,可以更容易地进行 XML 的解析、创建和修改。它还支持 XPath 查询,使开发者能够方便地定位到 XML 文档中的特定节点。 ### 2. 读取 XML 字符串的基本步骤 读取 ...

    xml object 互转

    - DOM解析:Document Object Model(DOM)是W3C推荐的一种解析XML的标准方法。它将整个XML文档加载到内存中,形成一个树形结构,允许我们通过节点遍历和操作XML。 - SAX解析:Simple API for XML(SAX)是一种基于...

    dom4j解析xml,利用反射机制

    DOM4J作为解析XML的库,遵循DOM(Document Object Model)模型,通过构建一棵节点树来表示XML文档的结构。 在`ParseMQ.java`文件中,通常会包含以下步骤: 1. 引入DOM4J库:导入必要的DOM4J库,如`org.dom4j....

    用dom4j解析xml文件

    DOM4J采用的是DOM(Document Object Model)模型,它将整个XML文档加载到内存中形成一棵树形结构,每个元素、属性、文本节点都是树上的一个节点。这样做的好处是便于对整个文档进行任意复杂的操作,但缺点是如果XML...

    dom4j自动解释xml文件

    DOM4J是一个强大的Java库,专门用于处理XML...通过理解XML的结构和DOM4J的API,开发者可以高效地读取、解析和操作XML数据,实现各种复杂的业务逻辑。在实际项目中,DOM4J的灵活性和性能使其成为处理XML的首选工具之一。

Global site tag (gtag.js) - Google Analytics