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

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. servlet第3讲(上集)----同一用户的不同页面共享数据

    1.方法综述 2.Cookie 3.sendRedict()方法     4.隐藏表单

  2. 运行出第一个程序Hello World、第二个程序网页浏览器

    很长时间没有发博客记录我的奋斗历程了,原因不外乎遇到了对我而言“巨大的”困难. 经历了长期的找不到合适的教材.找不到Xcode资源.运行不出例程的痛苦以后,近日终于走上正轨. 现在补发一个过去2个月来 ...

  3. CATransform3D的使用以及各个参数的含义

    1. 缩放 CABasicAnimation *theAnimation=[CABasicAnimation animationWithKeyPath:@"transform"]; ...

  4. 分布式事务实现-Spanner

    Spanner要满足的external consistency 是指:后开始的事务一定可以看到先提交的事务的修改.所有事务的读写都加锁可以解决这个问题,缺点是性能较差.特别是对于一些workload中 ...

  5. Vim常用命令【转载】

    下面基本是vim的基本用法,刚开始学习可能有些不习惯.但贵在坚持,即使不习惯,也要坚持使用,做到不经过思考就能操作,你会发现真的很方便.很多操作可以通过不同的命令达到,我这里只列出常用的. 基础命令 ...

  6. 中文输入法不触发onkeyup事件的解决办法

    当监听一个input的keyup的事件的时候,英文输入法的情况下可以实时的通过keyup事件检测到文本框value的变化,但是当输入法变成中文后,input的keyup事件就不会被正常触发. 方法:o ...

  7. project文件问题

    到编译文件中看看,红色的删除,坤哥这样做的 .

  8. __declspec(dllexport) 和 __declspec(dllimport)的作用

    operatordll.h #include <iostream> #ifndef _WIN32 #define DLL_EXPORT#else #ifdef OPERATORDLL_EX ...

  9. 清除number输入框的上下箭头

    <input type="number"/> 在chrome,firefox,safari浏览器上输入框右侧会有上下箭头 方法1: <input type=&qu ...

  10. ant 配置expdp and impap

    + 执行步骤: ant -f 1_exp_prod.xml copy file from prod to uat (maunule) ant -f  3_imp_uat.xml 附件: 1.1_exp ...