论坛首页 Java版

Dom4j递归解析XML实现JS的getElementsByName类似方法

浏览 4104 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2006-12-14 关键字: dom4j getelementsbyname 递归 解析xml
用惯了JS解析XML要在Java里面解析实在觉得麻烦,又有种多解析器,W3C,JDOM,DOM4J, SAX眼花缭乱,在网上搜到推荐用Dom4j于是就用了它。

但是发现Dom4J解析只能一层一层的按节点读甚是不爽,远没有JS的getElementsByName方法,一取一个数组这么简便,于是就自己写了一个。

先学习了一下Dom4j的使用方法,可以看这个网址,当然还可以去官网,不过我郁闷了半天没找到文档,用Eclipse的代码提示功能找了一下

http://heavyz.sourceforge.net/homepage/homepage_zh/comp/notes/dom4j.html

例子的XML文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<callcenter_response>
<action_id>PRODUCT_INFO</action_id>
<error>0</error>
<err_code/>
<err_desc/>
<count>1</count>
<total_page>1</total_page>
<page_no>1</page_no>
<record>
<service_code>1111</service_code>
<service_name>2222</service_name>
</record>
<record>
<service_code>1111</service_code>
<service_name>2222</service_name>
</record>
</callcenter_response>

只是举个简单的例子说明我编的程序的适用性,下面是代码了:

package com;

import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.Iterator;


import org.dom4j.Document;
import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

public class ReadConfig ...{
public static void main(String[] args) ...{

        SAXReader xmlReader = new SAXReader();

        try ...{
            Document doc = xmlReader.read("test.xml");
            
            Element root = doc.getRootElement();
            
            ReadConfig rc =new ReadConfig ();
            ArrayList ssa=new ArrayList();
            ArrayList list=rc.getElementsByName (ssa, root, "record");

             System.out.println( list.size());
        } catch (DocumentException e) ...{
            
            e.printStackTrace();
        }
    }
    public ArrayList getElementsByName(ArrayList elementName,Element top,String name)
    ...{
        
        if(top.getName().equalsIgnoreCase(name))
        ...{
          elementName.add(top);
        }
        Iterator iter = top.elementIterator();
        
        if (!iter.hasNext())...{return elementName;}
        else
        ...{
             while(iter.hasNext()) 
              ...{ 
                  Element sub = (Element)iter.next();
                  
                  getElementsByName(elementName,sub,name); 
             
              }
            
        }
        return elementName;
        
        
    }

}



这里不多解释,这个程序调试过,可以直接用,有兴趣我们讨论一下的就跟贴吧
   
最后更新时间:2006-12-14
楼主可以试试xpath,很方便
selectNodes && selectSingleNode
   
0 请登录后投票
最后更新时间:2006-12-14
对呀  dom4j对xpath的支持很好
没必要自己写递归便利的
   
0 请登录后投票
最后更新时间:2006-12-15
多看看dom4j的API,搂主就不用再重复造轮子了
   
0 请登录后投票
最后更新时间:2006-12-17
xpath 试了半天不出来,而且XPAth要求使用者知道节点的位置,没法叫一个项目组的人都很快地上手。
   
0 请登录后投票
最后更新时间:2006-12-18
dom4j的Element.elementIterator(tagName) 即可直接获得名字为tagName的elementlist的iterator.何必呢。
   
0 请登录后投票
最后更新时间:2006-12-20
l0979365428 写道
xpath 试了半天不出来,而且XPAth要求使用者知道节点的位置,没法叫一个项目组的人都很快地上手。



看来你是xpath初学者啊 呵呵
看看 xpath的
"descendant::" 关键字 
还有 "//" 的用法
   
0 请登录后投票
最后更新时间:2006-12-20
看看这个http://www.zvon.org/xxl/XPathTutorial/General/examples.html
有具体例子的
   
0 请登录后投票
最后更新时间:2007-01-24
今天到网上逛了一下,多谢各位指教,就是不知道xpath性能咋样啊,我正在看那个文档了,要是方便准备升级一下
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐