`
mikey.tsu
  • 浏览: 132694 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类

Java递归遍历XML所有元素

阅读更多
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.tree.DefaultAttribute;

/**
 * Java递归遍历XML所有元素
 * 
 * @author  Administrator
 * @version  [版本号, Apr 13, 2010]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class XmlParser
{
    // private static Map xmlmap = new HashMap(); 
    //存储xml元素信息的容器 
    private static ArrayList<Leaf> elemList = new ArrayList<Leaf>();
    
    public static void main(String args[])
        throws DocumentException
    {
        XmlParser test = new XmlParser();
        String path = "C:/a.xml";
        // 读取XML文件
        SAXReader reader = new SAXReader();
        Document doc = reader.read(path);
        // 获取XML根元素
        Element root = doc.getRootElement();
        test.getElementList(root);
        String x = test.getListString(elemList);
        System.out.println("-----------解析结果------------\n" + x);
    }
    
    /** 
     * 获取节点所有属性值
     * <功能详细描述>
     * @param element
     * @return
     * @see [类、类#方法、类#成员]
     */
    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);
            //System.out.println("name = " + e.getName() + ", value = " + e.getText());
            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), xpath, value));
        }
        else
        {
            // 有子元素
            Iterator it = elements.iterator();
            while (it.hasNext())
            {
                Element elem = (Element)it.next();
                // 递归遍历 
                getElementList(elem);
            }
        }
    }
    
    public String getListString(List elemList)
    {
        StringBuffer sb = new StringBuffer();
        for (Iterator it = elemList.iterator(); it.hasNext();)
        {
            Leaf leaf = (Leaf)it.next();
            sb.append("xpath: " + leaf.getXpath()).append(", value: ").append(leaf.getValue());
            if (!"".equals(leaf.getXattribute()))
            {
                sb.append(", Attribute: ").append(leaf.getXattribute());
            }
            sb.append("\n");
        }
        return sb.toString();
    }
}

/** 
* xml节点数据结构 
*/
class Leaf
{
    // 节点属性
    private String xattribute;
    
    // 节点PATH
    private String xpath;
    
    // 节点值
    private String value;
    
    public Leaf(String xattribute, String xpath, String value)
    {
        this.xattribute = xattribute;
        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;
    }
}

 

分享到:
评论
2 楼 v韧竹v 2010-12-16  
怎么属性没有遍历出来??
1 楼 v韧竹v 2010-12-15  

相关推荐

    Xml的递归遍历

    用java递归dom解析器解析遍历Xml文档

    dom4j 解析(读取) xml 节点数据

    此方法解析xml时,不受xml层级的限制。文件中包含了说明文档,java类,以及所使用到的*.jar。并对代码做了注释让你一目了然……

    java源码包2

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...

    java源码包---java 源码 大量 实例

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    JAVA上百实例源码以及开源项目源代码

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    JAVA上百实例源码以及开源项目

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    java源码包4

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...

    java源码包3

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    python实现遍历文件夹修改文件后缀

    用法 python Modifer.py ./ -fp java xml # coding:utf-8 # Build by LandGrey 2016-05-27 import os import sys #批量修改路径与文件名 def Modifyprefix(Path,oldcontent,newcontent): all_file_list = os....

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    java 面试题 总结

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出Session...

    FreeMarker模板引擎-其他

    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。...指令(2.3版本)用于递归遍历XML树 在模板中清楚和直觉的访问XML对象模型 开源论坛 JForum 就是使用了 FreeMarker 做为页面模板。

    jsr80 java 访问 usb

    得到 hub 上可用的 USB 端口数量,遍历所有端口以找到正确的 Device 。 访问附加到特定端口上的 USB Device 。可以用一台 Device 的 PortIdentifier 直接从 Host 访问它,也可以通过从 root hub 开始遍历 USB Bus ...

    超级有影响力霸气的Java面试题大全文档

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出...

    《javaScrip开发技术大全》源代码

    • sample16.htm 使用for each…in语句遍历对象属性和数组元素 • sample17.htm 对象的引用 • sample18.htm with语句 • sample19.htm with语句的等价代码 • sample20....

    快学 scala 中文版 带完整目录

    3.3 遍历数组和数组缓冲 41 3.4 数组转换 42 3.5 常用算法 44 3.6 解读Scaladoc 45 3.7 多维数组 47 3.8 与Java的互操作 48 练习 49 第4章 映射和元组 A1 53 4.1 构造映射 53 4.2 获取映射中的值 54 4.3 ...

    Java学习笔记-个人整理的

    {1.11.3}递归调用}{41}{subsection.1.11.3} {1.12}Java API}{41}{section.1.12} {1.13}Linux命令}{41}{section.1.13} {1.13.1}基本查看、移动}{41}{subsection.1.13.1} {1.13.2}权限}{42}{subsection.1.13.2} ...

Global site tag (gtag.js) - Google Analytics