Dom4j遍历解析XML测试

近来老和XML打交道,不深挖不行了。。
 
这是一个Dom4j解析XML的例子,为做复杂递归处理前期所写的例子。涵盖了XML的解析方面大部分核心API。
 
环境:
Dom4j-1.6.1
 
Dom4j解析需要XML需要的最小类库为:
dom4j-1.6.1.jar
jaxen-1.1-beta-6.jar
 
目标:
解析一个xml,输出所有的属性和元素值。
 
测试代码:
 
XML文件:
<? xml  version ="1.0"  encoding ="GBK" ?> 
< doc > 
     < person  id ="1"  sex ="m" > 
         < name >zhangsan </ name > 
         < age >32 </ age > 
         < adds > 
             < add  code ="home" >home add </ add > 
             < add  code ="com" >com add </ add > 
         </ adds > 
     </ person > 
     < person  id ="2"  sex ="w" > 
         < name >lisi </ name > 
         < age >22 </ age > 
         < adds > 
             < add  ID ="22"  id ="23"  code ="home" >home add </ add > 
             < add  ID ="23"  id ="22"  code ="com" >com add </ add > 
             < add  id ="24"  code ="com" >com add </ add > 
         </ adds > 
     </ person > 
</ doc >
 
 
解析代码:
package com.topsoft.test; 

import org.dom4j.io.SAXReader; 
import org.dom4j.Document; 
import org.dom4j.DocumentException; 
import org.dom4j.Element; 
import org.dom4j.Node; 

import java.util.Iterator; 
import java.util.List; 
import java.io.InputStream; 

/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-3-26 15:53:51<br> 
* <b>Note</b>: Dom4j遍历解析XML测试 
*/
 
public  class TestDom4j { 
     /** 
     * 获取指定xml文档的Document对象,xml文件必须在classpath中可以找到 
     * 
     * @param xmlFilePath xml文件路径 
     * @return Document对象 
     */
 
     public  static Document parse2Document(String xmlFilePath) { 
        SAXReader reader =  new SAXReader(); 
        Document document =  null
         try { 
            InputStream in = TestDom4j. class.getResourceAsStream(xmlFilePath); 
            document = reader.read(in); 
        }  catch (DocumentException e) { 
            System.out.println(e.getMessage()); 
            System.out.println( "读取classpath下xmlFileName文件发生异常,请检查CLASSPATH和文件名是否存在!"); 
            e.printStackTrace(); 
        } 
         return document; 
    } 

     public  static  void testParseXMLData(String xmlFileName) { 
         //产生一个解析器对象 
        SAXReader reader =  new SAXReader(); 
         //将xml文档转换为Document的对象 
        Document document = parse2Document(xmlFileName); 
         //获取文档的根元素 
        Element root = document.getRootElement(); 
         //定义个保存输出xml数据的缓冲字符串对象 
        StringBuffer sb =  new StringBuffer(); 
        sb.append( "通过Dom4j解析XML,并输出数据:\n"); 
        sb.append(xmlFileName +  "\n"); 
        sb.append( "----------------遍历start----------------\n"); 
         //遍历当前元素(在此是根元素)的子元素 
         for (Iterator i_pe = root.elementIterator(); i_pe.hasNext();) { 
            Element e_pe = (Element) i_pe.next(); 
             //获取当前元素的名字 
            String person = e_pe.getName(); 
             //获取当前元素的id和sex属性的值并分别赋给id,sex变量 
            String id = e_pe.attributeValue( "id"); 
            String sex = e_pe.attributeValue( "sex"); 
            String name = e_pe.element( "name").getText(); 
            String age = e_pe.element( "age").getText(); 
             //将数据存放到缓冲区字符串对象中 
            sb.append(person +  ":\n"); 
            sb.append( "\tid=" + id +  " sex=" + sex +  "\n"); 
            sb.append( "\t" +  "name=" + name +  " age=" + age +  "\n"); 

             //获取当前元素e_pe(在此是person元素)下的子元素adds 
            Element e_adds = e_pe.element( "adds"); 
            sb.append( "\t" + e_adds.getName() +  "\n"); 

             //遍历当前元素e_adds(在此是adds元素)的子元素 
             for (Iterator i_adds = e_adds.elementIterator(); i_adds.hasNext();) { 
                Element e_add = (Element) i_adds.next(); 
                String code = e_add.attributeValue( "code"); 
                String add = e_add.getTextTrim(); 
                sb.append( "\t\t" + e_add.getName() +  ":" +  " code=" + code +  " value=\"" + add +  "\"\n"); 
            } 
            sb.append( "\n"); 
        } 
        sb.append( "-----------------遍历end-----------------\n"); 
        System.out.println(sb.toString()); 


        System.out.println( "---------通过XPath获取一个元素----------"); 
        Node node1 = document.selectSingleNode( "/doc/person"); 
        System.out.println( "输出节点:" + 
                 "\t"+node1.asXML()); 

        Node node2 = document.selectSingleNode( "/doc/person/@sex"); 
        System.out.println( "输出节点:" + 
                 "\t"+node2.asXML()); 

        Node node3 = document.selectSingleNode( "/doc/person[name=\"zhangsan\"]/age"); 
        System.out.println( "输出节点:" + 
                 "\t"+node3.asXML()); 

        System.out.println( "\n---------XPath获取List节点测试------------"); 
        List list = document.selectNodes( "/doc/person[name=\"zhangsan\"]/adds/add"); 
         for(Iterator it=list.iterator();it.hasNext();){ 
            Node nodex=(Node)it.next(); 
            System.out.println(nodex.asXML()); 
        } 

        System.out.println( "\n---------通过ID获取元素的测试----------"); 
        System.out.println( "陷阱:通过ID获取,元素ID属性名必须为“大写ID”,小写的“id”会认为是普通属性!"); 
        String id22 = document.elementByID( "22").asXML(); 
        String id23 = document.elementByID( "23").asXML(); 
        String id24 =  null
         if (document.elementByID( "24") !=  null) { 
            id24 = document.elementByID( "24").asXML(); 
        }  else { 
            id24 =  "null"
        } 

        System.out.println( "id22=  " + id22); 
        System.out.println( "id23=  " + id23); 
        System.out.println( "id24=  " + id24); 
    } 


     public  static  void main(String args[]) { 
        testParseXMLData( "/person.xml"); 
    } 
}
 
 
运行结果:
通过Dom4j解析XML,并输出数据: 
/person.xml 
----------------遍历start---------------- 
person: 
    id=1 sex=m 
    name=zhangsan age=32 
    adds 
  add: code=home value="home add" 
  add: code=com value="com add" 

person: 
    id=2 sex=w 
    name=lisi age=22 
    adds 
  add: code=home value="home add" 
  add: code=com value="com add" 
  add: code=com value="com add" 

-----------------遍历end----------------- 

---------通过XPath获取一个元素---------- 
输出节点:     < person  id ="1"  sex ="m" > 
         < name >zhangsan </ name > 
         < age >32 </ age > 
         < adds > 
             < add  code ="home" >home add </ add > 
             < add  code ="com" >com add </ add > 
         </ adds > 
     </ person > 
输出节点:    sex="m" 
输出节点:     < age >32 </ age > 

---------XPath获取List节点测试------------ 
< add  code ="home" >home add </ add > 
< add  code ="com" >com add </ add > 

---------通过ID获取元素的测试---------- 
陷阱:通过ID获取,元素ID属性名必须为“大写ID”,小写的“id”会认为是普通属性! 
id22=   < add  ID ="22"  id ="23"  code ="home" >home add </ add > 
id23=   < add  ID ="23"  id ="22"  code ="com" >com add </ add > 
id24=  null 

Process finished with exit code 0 
 
发个Idea7开发界面截图:  点击图片放大
 
 
想从头了解dom4j的朋友可以看dom4j文档中的quick start,这个是E文版的,另外有热心的网友已经将自己翻译的中文版奉献出来了,可以看看:
 
 

本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/66953,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值