`
yehuijia
  • 浏览: 9399 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

利用dom4j对任意xml的解析

    博客分类:
  • JAVA
阅读更多
java利用dom4j对任意xml的解析JAVA 2009-12-26 17:01:35 阅读23 评论2 字号:大中小
             最近完成了java对任意对象生成xml,有写了下java对任意一个xml文件的解析,生成主要靠反射原理来完成,而解析则主要是遍历xml树的每个节点,并对每个节点进行处理。刚刚开始我写了个如下的解析文件。



package javaForXML;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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

/**
* 利用dom4j进行XML解析
* 没用递归,本类只能解析到两层嵌套的属性和值
* @date Dec 25, 20094:43:47 PM
* @author zhangjp
* @param
*/
public class PraseXMLTest5 {
   
    /**
     * 遍历每个节点和属性
     * @param filename
     * @returnPraseXMLTest5.java
     */
public  static  List<Map<String,String>> iterateWholeXML(String filename) {

  List <Map<String,String>>list = new ArrayList<Map<String,String>>();
  SAXReader saxReader = new SAXReader();

   try {
    Document document = saxReader.read(new File(filename));
    Element root = document.getRootElement();

    // 遍历根结点的所有孩子节点
    for (Iterator iter = root.elementIterator(); iter.hasNext();) {
     HashMap<String, String> map = new HashMap<String, String>();

     Element element = (Element) iter.next();
     if (element == null)
      continue;
     // 获取属性和它的值
     for (Iterator attrs = element.attributeIterator(); attrs.hasNext();) {
      Attribute attr = (Attribute) attrs.next();
      if (attr == null)
       continue;
      String attrName = attr.getName();
      String attrValue = attr.getValue();

      map.put(attrName, attrValue);
     }
     if(element.isTextOnly()){
      String elementName = element.getName();
      String elementValue = element.getText();
      map.put(elementName, elementValue);
     }else{
     // 遍历结点的所有孩子节点,并进行处理
     for (Iterator iterInner = element.elementIterator(); iterInner.hasNext();) {
       Element elementInner = (Element) iterInner.next();
       //如果没有孩子结点,则直接取值
       if (elementInner == null){
        String elementName = element.getName();
        String elementValue = element.getText();
        map.put(elementName, elementValue);
       }
       
       //孩子结点的属性
       for(Iterator innerAttrs = elementInner.attributeIterator();innerAttrs.hasNext();){
        Attribute innerAttr = (Attribute)innerAttrs.next();
        if(innerAttr == null)
         continue;
        String innerAttrName = innerAttr.getName();
        String innerAttrValue = innerAttr.getValue();
        map.put(innerAttrName, innerAttrValue);
       }
       //假定没有第三层嵌套,获得第二层的值
       String innerName = elementInner.getName();
       String innerValue = elementInner.getText();
       map.put(innerName, innerValue);
     
      }
    
     }
     list.add(map);
    }
       return list;
   } catch (DocumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return null;

}
   

/**
  * 测试
  * @param args
  * @throws DocumentExceptionPraseXMLTest5.java
  */
public static void main(String[] args) throws DocumentException {
  String filename = "d:\\data.xml";
  List<Map<String,String>> list = PraseXMLTest5.iterateWholeXML(filename);
  for(Map <String,String>map:list){
  for (String ss : map.keySet()) {
   System.out.println(ss + ":" + map.get(ss));
  }
  }
}
}




这个写的很累,具体说很累赘,而且只能遍历xml的两层嵌套,对三层或更多的嵌套无能无力。于是很明显的看到这里用一个递归式多么容易的事情。于是写了下面这个代码:



package javaForXML;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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

/**
* 利用dom4j进行XML解析
* 利用递归,本类对所有嵌套进行递归遍历
* @date Dec 25, 20094:43:47 PM
* @author zhangjp
* @param
*/
public class PraseXMLTest6 {
   
    /**
     * 遍历每个节点和属性
     * @param filename
     * @returnPraseXMLTest5.java
     */
public  static  List<Map<String,String>> iterateWholeXML(String filename) {

  List <Map<String,String>>list = new ArrayList<Map<String,String>>();
  SAXReader saxReader = new SAXReader();

   try {
    Document document = saxReader.read(new File(filename));
    Element root = document.getRootElement();
    recursiveNode(root,list);
       return list;
   } catch (DocumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return null;

}
   
/**
  * 递归遍历所有的节点获得对应的值
  * @param rootPraseXMLTest6.java
  */
private static void recursiveNode(Element root,List <Map<String,String>>list ){
  // 遍历根结点的所有孩子节点
  for (Iterator iter = root.elementIterator(); iter.hasNext();) {
   HashMap<String, String> map = new HashMap<String, String>();

   Element element = (Element) iter.next();
   if (element == null)
    continue;
   // 获取属性和它的值
   for (Iterator attrs = element.attributeIterator(); attrs.hasNext();) {
    Attribute attr = (Attribute) attrs.next();
    if (attr == null)
     continue;
    String attrName = attr.getName();
    String attrValue = attr.getValue();

    map.put(attrName, attrValue);
   }
   //如果有PCDATA,则直接提出
   if(element.isTextOnly()){
    String innerName = element.getName();
    String innerValue = element.getText();
    map.put(innerName, innerValue);
     list.add(map);
   }else{
     list.add(map);
        //递归调用
           recursiveNode(element ,list);   
   }

  }
}

/**
  * 测试
  * @param args
  * @throws DocumentExceptionPraseXMLTest5.java
  */
public static void main(String[] args) throws DocumentException {
  String filename = "d:\\zhang.xml";
  List<Map<String,String>> list = PraseXMLTest6.iterateWholeXML(filename);
  for(Map <String,String>map:list){
  for (String ss : map.keySet()) {
   System.out.println(ss + ":" + map.get(ss));
  }
  }
}
}






    用了递归后,节省很多代码。看起来也比较简单明了,最大的好处是对于任意多个嵌套的xml文件的解析都不在话下,呵呵 ~ 好了 ,这个解析比生成要简单的多,好好悟吧。
分享到:
评论

相关推荐

    xml解析新浪新闻_客户端

    DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。 SAX解析XML,是基于事件通知的...

    iOS开发中常见的解析XML的类库以及简要安装方法

    DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。 SAX解析XML,是基于事件通知的...

    tinyxml2:TinyXML2是一个简单,小型,高效的C ++ XML解析器,可以轻松集成到其他程序中

    TinyXML-2 TinyXML-2是一个简单,小型,高效的C ++ XML解析器,可以轻松地集成到其他程序中。 主机托管在github上: : 这些文档的在线HTML版本: : 示例在HTML文档的“相关页面”选项卡中。它能做什么。 简而言之,...

    易语言-Mini-XML迷你型XML解析器

    Mini-XML是一个小型的开源的XML解析器,采用 C 语言开发。该解析器最大的特点就是小型、无须依赖其他类库,只需要 GCC 编译器 和 make 程序即可编译,支持 UTF-8/UTF-16 编码。 Mini-XML支持读取UTF-8和UTF-16和UTF-...

    xml入门教程/xml入门教程

    XSLT,是用于对XML进行文档格式转换,把一个XML文档转换成另一种格式的XML文档,但是其中内容是不变的。 &2.DTD(Document Type Difinition DTD文档是用于规定XML文档的结构。只有结构符合所引用的DTD文件的XML文件...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    3.2.4 用dom解析xml文档实例 53 3.3 使用sax解析xml文档 65 3.3.1 sax的处理机制 66 3.3.2 配置sax解析器 69 3.3.3 sax解析器工厂 70 3.3.4 sax的异常类 71 3.3.5 errorhandler接口 73 3.3.6 使用sax解析xml...

    Python获取任意xml节点值的方法

    本文实例讲述了Python获取任意xml节点值的方法。分享给大家供大家参考。具体实现方法如下: # -*- coding: utf-8 -*- import xml.dom.minidom ELEMENT_NODE = xml.dom.Node.ELEMENT_NODE class SimpleXmlGetter...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    3.2.4 用dom解析xml文档实例 53 3.3 使用sax解析xml文档 65 3.3.1 sax的处理机制 66 3.3.2 配置sax解析器 69 3.3.3 sax解析器工厂 70 3.3.4 sax的异常类 71 3.3.5 errorhandler接口 73 3.3.6 使用sax解析xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    3.2.4 用dom解析xml文档实例 53 3.3 使用sax解析xml文档 65 3.3.1 sax的处理机制 66 3.3.2 配置sax解析器 69 3.3.3 sax解析器工厂 70 3.3.4 sax的异常类 71 3.3.5 errorhandler接口 73 3.3.6 使用sax解析xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    3.2.4 用dom解析xml文档实例 53 3.3 使用sax解析xml文档 65 3.3.1 sax的处理机制 66 3.3.2 配置sax解析器 69 3.3.3 sax解析器工厂 70 3.3.4 sax的异常类 71 3.3.5 errorhandler接口 73 3.3.6 使用sax解析xml...

    JAVA中XML讲解(应用案例)

    文章目录一.XML文件的概述(1)什么是XML(2)XML 与 HTML 的主要差异(3)XML语法(4)XML 命名规则(5)XML作用(6)XML基本结构二.XML解析(1)解析方式(2)DOM4J相关类 一.XML文件的概述 (1)什么是XML XML 指...

    在Python中处理XML的教程

    DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。 正常情况下,优先考虑SAX,因为DOM实在太占...

    基于Java实现的秒杀+shiro权限+信息采集等系统的实现源码

    秒杀项目练习 :seckill 该项目总体架构: Maven + SSM 日志: slf4j + logback 数据库相关:Mysql + c3p0 权限控制项目练习:springboot-shiro ...配置模块:单例模式,dom4j解析xml,IOC控制反转

    Python中base64与xml取值结合问题

    Base64是一种用64个字符来表示任意二进制数据的方法。 用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理...

    JAVA_API1.6文档(中文)

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    SAXParse.rar

    SAX包文件,可以直接进行xml的解析,需要导入包才可以使用,SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,...

    JavaScript王者归来part.1 总数2

     12.8.2 如何使用XML DOM--一个利用XML实现多级关联下拉选择框的例子   12.9 总结   第13章 事件处理  13.1 什么是事件   13.1.1 消息与事件响应   13.1.2 浏览器的事件驱动机制   13.2 基本事件处理  ...

    java api最新7.0

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml....

Global site tag (gtag.js) - Google Analytics