在网上找了好久,都没搞出来,借鉴别人的代码,依葫芦画瓢,写了个自己用的解析类。注意节点属性和子节点的区别就好了,这个包的方法还挺好用的

package com.allinpay.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.tree.DefaultAttribute;

/**
* Java递归遍历XML所有元素
*
* @author 李许民
* @date 2017年1月16日15:01:14
*/
public class XMLparseUtil
{
//存储xml元素信息的容器
private static ArrayList<Leaf> elemList = new ArrayList<Leaf>();

/**
* 获取节点所有属性值
* <功能详细描述>
* @param element
* @return
* @see [类、类#方法、类#成员]
*/
public static Map<String, String> XMLparse(String xmlStr) {
XMLparseUtil xmLparseUtil = new XMLparseUtil();
Map<String, String> mapRerult = new HashMap<>();
Document doc = null;
try {
doc = DocumentHelper.parseText(xmlStr);
} catch (DocumentException e) {
e.printStackTrace();
}
// 获取XML根元素
Element root = doc.getRootElement();
xmLparseUtil.getElementList(root);
for (Leaf leaf : elemList) {
mapRerult.put(leaf.getElementName(), leaf.getValue());
}
return mapRerult;
}
/**
* 获取节点的属性
* @param element
* @return
*/
public String getNoteAttribute(Element element)
{
String xattribute = "";
DefaultAttribute e = null;
List<?> list = element.attributes();
for (int i = 0; i < list.size(); i++)
{
e = (DefaultAttribute)list.get(i);
xattribute += " [name = " + e.getName() + ", value = " + e.getText() + "]";
}
return xattribute;
}

/**
* 递归遍历方法
* <功能详细描述>
* @param element
* @see [类、类#方法、类#成员]
*/
public void getElementList(Element element)
{
List<?> elements = element.elements();
// 没有子元素
if (elements.isEmpty())
{
String xpath = element.getPath();
String value = element.getTextTrim();
elemList.add(new Leaf(getNoteAttribute(element),element.getName(), xpath, value));
}
else
{
// 有子元素
Iterator<?> it = elements.iterator();
while (it.hasNext())
{
Element elem = (Element)it.next();
// 递归遍历
getElementList(elem);
}
}
}
/**
* 解析测试
* @param args
* @throws DocumentException
*/
public static void main(String args[])
throws DocumentException
{
String testStr = "<?xml version='1.0' encoding='UTF-8'?>"
+ "<epay>"
+ "<retcode>0</retcode>"
+ "<sign_type>MD5</sign_type>"
+ "<service>query_order_service</service>"
+ "<service_version>1.0"
+ "</service_version>"
+ "<sign>82c9636fac495ceb0c378a36a6a43914</sign>"
+ "<input_charset>UTF-8</input_charset>"
+ "<fee_type>1</fee_type>"
+ "<attach>test</attach>"
+ "<bank_transno>123123123123123</bank_transno>"
+ "<out_trade_no>00000002</out_trade_no>"
+ "<total_fee>300</total_fee>"
+ "<product_fee>50</product_fee>"
+ "<transport_fee>50</transport_fee>"
+ "<discount>5.51</discount>"
+ "<reconciliation_state>false</reconciliation_state>"
+ "<time_end>20131005 17:10:49</time_end>"
+ "<trade_mode>0001</trade_mode>"
+ "<trade_state>0</trade_state>"
+ "<transaction_id>201310045</transaction_id>"
+ "</epay>";
Map<String, String> map = XMLparseUtil.XMLparse(testStr);
System.out.println(map);
}
}

/**
* xml节点数据结构
*/
class Leaf
{
// 节点属性
private String xattribute;
//节点名字
private String elementName;

// 节点PATH
private String xpath;

// 节点值
private String value;

public Leaf(String xattribute, String elementName , String xpath, String value)
{
this.xattribute = xattribute;
this.elementName=elementName;
this.xpath = xpath;
this.value = value;
}

public String getXpath()
{
return xpath;
}

public void setXpath(String xpath)
{
this.xpath = xpath;
}

public String getValue()
{
return value;
}

public void setValue(String value)
{
this.value = value;
}

public String getXattribute()
{
return xattribute;
}

public void setXattribute(String xattribute)
{
this.xattribute = xattribute;
}
public String getElementName() {
return elementName;
}

public void setElementName(String elementName) {
this.elementName = elementName;
}
}

在java中使用dom4j包对String格式的xm数据l解析的更多相关文章

  1. 转:在java中使用dom4j解析xml

    JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...

  2. java中常用的包、类、以及包中常用的类、方法、属性----sql和text\swing

    java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.sql.*; java.text.*; java.a ...

  3. Java中的Dom4j

    上一篇讲了Java中如何操作XML,现在介绍一个更厉害的方法,Dom4j ,百度查一下就知道,这个更强,更快,更简单. 自己下载jar包导入工具,下面来讲一个例子,我事先准备了一个XML文件,如下: ...

  4. JavaSE&&JavaEE&&JavaME的区别【Java中常用的包结构】

    一.javaEEJavaSEJavaME用的同一个jar包吗? javaEE JavaSE javaME 用的JDK是同一个,开发j2SE工程的话只要有JDK就可以了,开发J2EE工程和J2ME工程除 ...

  5. 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接

    长久以来,我们被教导字符串的连接最好用StringBuffer.StringBuilder,但是我们却不知道这两者之间的区别.跟字符串相关的一些方法中总是有CharSequence.StringBuf ...

  6. 全面解释java中StringBuilder、StringBuffer、String类之间的关系

    StringBuilder.StringBuffer.String类之间的关系 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,在上一篇博文中我 ...

  7. Java中equal和==区别及String创建过程

    Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...

  8. JAVA中Integer.valueOf, parsetInt() String.valueOf的区别和结果

    先来看段代码 public class IntegerDemo { public static void main(String[] args) { String num = null; System ...

  9. Java中常见的包

    目录 JDK自带的包 第三方包 JDK自带的包 JAVA提供了强大的应用程序接口,既JAVA类库.他包含大量已经设计好的工具类,帮助程序员进行字符串处理.绘图.数学计算和网络应用等方面的工作.下面简单 ...

随机推荐

  1. mvc Area相关技术

    ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块都由MVC中的三层所 ...

  2. MyEclipse修改项目名称

    项目上右击鼠标–>Properties–>MyEclipse–>Web–>Content Root–>Web content-root–>改成你想要的项目名 即可 ...

  3. Storyboard中拖拽控件不能运行的问题(在运行的时候,相应的控件代码没有被执行)

    具体问题见 http://q.cnblogs.com/q/62183/ storyboard Table view上Selection 那一项要用single selection

  4. C#输出日历

    用C#输出日历,此功能可用于Ajax方式列出计划日程相关的内容,由于是C#控制输出,可以方便加上自己需要的业务处理逻辑. 1.控制台输出: using System; namespace 控制台日历 ...

  5. jni中的参数含义

    #include <jni.h> JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_helloFromC ( ...

  6. ajax学习之post请求步骤

    ajax学习之post请求步骤 蚣汉御豁 讼护尧 娉郐皑 磲 力豪强的虎视眈眈相信过不了 觏随迦趾 怪了灵敏儿竟然不慌不忙的也没有来找她们 缸轰诎 ?ê戆冼 跄鲅胗绩 掳戈玉孑 馀模嗷婧 ...

  7. MySQL 视图 总结

    什么是视图 视图是从一个或多个表中导出来的表,是一种虚拟存在的表. 视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据. 这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据. 数 ...

  8. kill -0

    http://unix.stackexchange.com/questions/169898/what-does-kill-0-do 检查有没有权限杀他

  9. oracle中的turnc,round,floor,ceil,coalesce函数

    这四个函数有点类似java中的函数,首先是 trunc(number,[decimals]) 这个函数类似截取函数 number:表示你要输入的数 decimals(小数): 表示你要截取的位数[正数 ...

  10. eclipse提升注解提示速度

    preference--输入content--java--editor--content Assist--aoto delay 选项 改为100或者更低  提示速度              --ao ...