最近一个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>
分享到:
相关推荐
Dom4J(Document Object Model for Java)是一款开源的、轻量级的Java库,用于处理XML文档。它提供了一套灵活且强大的API,使得开发者可以轻松地创建、读取、修改和输出XML数据。Dom4J的核心类`Document`代表整个XML...
当我们需要将XML字符串解析并映射到Java Bean对象时,dom4j是一个常用的库。本篇文章将详细探讨如何使用dom4j库实现这个过程。 首先,dom4j是一个强大的Java XML API,它提供了丰富的功能,如读取、写入、修改和...
DOM4j则是一个强大的Java库,用于处理XML文档,提供了丰富的API来实现XML的读取、写入、修改等操作。在这个示例中,我们将深入探讨如何利用Maven管理和DOM4j来操作XML文件。 首先,让我们了解一下Maven。Maven是...
6. **XPath和XSLT转换**:除了基本的XML操作,DOM4J还能配合XPath执行XSLT(eXtensible Stylesheet Language Transformations)转换,实现XML到XML或XML到其他格式(如HTML)的转换。 7. **JAXB集成**:虽然DOM4J...
DOM4J的名字来源于“Document Object Model for Java”,它采用面向对象的设计思想,提供了对XML文档的全面支持。 DOM4J库的核心功能包括: 1. **解析XML**:DOM4J可以读取XML文件,将其转换为一个树形结构,即...
**DOM4J解析XML实例详解** 在Java编程中,处理XML文档是一项常见的任务。DOM4J是一个非常流行的、强大的Java XML API,它提供了灵活且高效的方式来解析、创建、修改XML文档。本文将深入探讨如何使用DOM4J进行XML...
总结,使用DOM4J库,我们可以方便地在Java中实现XML与Map之间的互转。这不仅适用于简单的键值对,还支持嵌套结构、属性以及有无根节点的情况。在实际项目中,可以根据具体需求对这些方法进行适当的调整和优化。
DOM4J是基于DOM(Document Object Model)的,但它通过提供更高级别的API来简化XML操作,使得开发者可以更方便地处理XML结构。 **DOM4J的核心概念** 1. **Element**: 在DOM4J中,`Element`是XML文档中最基本的结构...
DOM4J采用Document Object Model (DOM)接口,但它的实现比标准DOM更快,占用内存更少。DOM4J的核心类包括`Document`、`Element`、`Attribute`和`Namespace`等,它们分别代表XML文档、元素、属性和命名空间。 在`dom...
5. **DOM4J与JAXB(Java Architecture for XML Binding)对比**:虽然两者都可以处理XML,但DOM4J更侧重于底层的XML操作,而JAXB则用于将Java对象和XML之间进行自动转换,更适用于对象和XML映射的需求。 6. **示例...
"dom4j-jar与dom4j解析xml文档介绍" 这个标题告诉我们,我们将探讨的是一个关于dom4j库的jar文件,以及如何使用这个库来解析XML文档。dom4j是一个Java库,它提供了丰富的API用于处理XML、HTML和DOM文档。这里的"jar...
与DOM(Document Object Model)相比,DOM4J更轻量级,内存占用少,且操作XML更加直观。接下来,我们将探讨如何使用DOM4J进行XML的创建和解析。 **一、创建XML文件** 1. 引入DOM4J库:在Java项目中,你需要添加DOM...
然而,DOM4J并不是Java内置的DOM实现,而是基于SAX(Simple API for XML)和DOM的混合模型,这使得它在性能和易用性之间找到了平衡。DOM4J通过提供一种更符合Java习惯的对象模型,使得开发者可以更自然地操作XML文档...
DOM4J是Java中解析XML的常用库之一,其名称中的“DOM”指的是Document Object Model,这是一个W3C标准,用于表示XML文档的树型结构。DOM4J不仅支持DOM,还提供了SAX(Simple API for XML)和StAX(Streaming API for...
与传统的 DOM API 相比,DOM4J 提供了更友好的 API,可以更容易地进行 XML 的解析、创建和修改。它还支持 XPath 查询,使开发者能够方便地定位到 XML 文档中的特定节点。 ### 2. 读取 XML 字符串的基本步骤 读取 ...
- DOM解析:Document Object Model(DOM)是W3C推荐的一种解析XML的标准方法。它将整个XML文档加载到内存中,形成一个树形结构,允许我们通过节点遍历和操作XML。 - SAX解析:Simple API for XML(SAX)是一种基于...
DOM4J作为解析XML的库,遵循DOM(Document Object Model)模型,通过构建一棵节点树来表示XML文档的结构。 在`ParseMQ.java`文件中,通常会包含以下步骤: 1. 引入DOM4J库:导入必要的DOM4J库,如`org.dom4j....
DOM4J采用的是DOM(Document Object Model)模型,它将整个XML文档加载到内存中形成一棵树形结构,每个元素、属性、文本节点都是树上的一个节点。这样做的好处是便于对整个文档进行任意复杂的操作,但缺点是如果XML...
DOM4J是一个强大的Java库,专门用于处理XML...通过理解XML的结构和DOM4J的API,开发者可以高效地读取、解析和操作XML数据,实现各种复杂的业务逻辑。在实际项目中,DOM4J的灵活性和性能使其成为处理XML的首选工具之一。