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,如需转载请自行联系原作者
相关文章
|
1天前
|
XML 存储 JavaScript
XML DOM 加载函数
`loadXMLString()`函数被封装在名为&quot;loadxmlstring.js&quot;的外部JavaScript文件中,用于加载XML文档。在示例HTML中,这个函数被调用来处理动态生成的XML字符串,该字符串描述了一本名为&quot;Everyday Italian&quot;的书籍信息。之后,可以在`code goes here.....`处进一步处理`xmlDoc`对象。
|
1天前
|
XML 存储 JavaScript
XML DOM 加载函数
`loadXMLDoc()` 是一个JavaScript函数,用于加载XML文档。它支持XMLHttpRequest和ActiveXObject,适应不同浏览器。函数定义存储在名为`loadxmldoc.js`的外部文件中,包含在HTML `&lt;head&gt;`标签内,然后在页面脚本中调用来获取XML数据,如`books.xml`。接下来的章节将介绍如何处理加载的数据。
|
2天前
|
XML JavaScript 前端开发
XML DOM - 属性和方法
XML DOM 提供编程接口,用属性和方法访问及操作XML节点。通过JavaScript等语言,可利用DOM属性(如nodeName, nodeValue, parentNode, childNodes, attributes)了解和修改节点信息。方法如getElementsByTagName用于查找特定标签元素,appendChild和removeChild则用于添加或移除子节点。
|
2天前
|
前端开发 JavaScript 数据安全/隐私保护
前端javascript的DOM对象操作技巧,全场景解析(二)
前端javascript的DOM对象操作技巧,全场景解析(二)
|
2天前
|
移动开发 缓存 JavaScript
前端javascript的DOM对象操作技巧,全场景解析(一)
前端javascript的DOM对象操作技巧,全场景解析(一)
|
3天前
|
XML Web App开发 JavaScript
XML DOM 解析器
大多数浏览器内置XML解析器,用于将XML转换为JavaScript可操作的DOM对象。解析器提供遍历、修改XML节点的功能。以下JS代码示例展示了如何加载XML文档:&quot;books.xml&quot;,通过XMLHttpRequest或ActiveXObject发送请求,获取响应并转化为DOM对象。
|
3天前
|
XML JavaScript 数据格式
XML DOM 节点树
在XML文档中最后一个。
|
4天前
|
XML JavaScript 数据格式
XML DOM 节点树
**XML DOM**将XML文档建模为节点树,其中每个组件都是节点,相关联并可操作。树有根节点,扩展至包含子节点和文本节点的分支。节点间关系包括父-子和同级。根节点居首,每个非根节点有唯一父节点,可有多个子节点,叶子节点无子节点,同级节点共享父节点。通过DOM可访问、修改、创建和删除节点。
|
4天前
|
XML 存储 JavaScript
XML DOM 节点
**XML DOM 把文档解析成节点树:** - 文档是个文档节点 - 每个元素是元素节点,如 `&lt;year&gt;` - 文本、属性和注释对应不同节点 - 元素的文本(如 &quot;2005&quot;)存于单独的文本节点 - `&lt;year&gt;` 的值是其包含的文本节点内容
|
4天前
|
XML JavaScript 数据格式
XML DOM 简介
XML DOM是W3C标准,提供访问和处理XML及HTML文档的统一接口。它分为核心DOM、XML DOM和HTML DOM三个部分。DOM定义了文档元素的对象、属性及访问方法。HTML DOM专注HTML,而XML DOM专注于XML,两者均为平台和语言中立的标准化编程接口,用于创建、修改和操作文档内容。

推荐镜像

更多