zoukankan      html  css  js  c++  java
  • 使用dom4j解析xml文件

     DOM4J

        与利用DOM、SAX、JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml。dom4j是一套开源的api。实际项目中,往往选择dom4j来作为解析xml的利器。

    先来看看dom4j中对应XML的DOM树建立的继承关系

      

    针对于XML标准定义,对应于图中列出的内容,dom4j提供了以下实现:

      

    同时,dom4j的NodeType枚举实现了XML规范中定义的node类型。如此可以在遍历xml文档的时候通过常量来判断节点类型了。

    常用API

    class org.dom4j.io.SAXReader

    • read  提供多种读取xml文件的方式,返回一个Domcument对象

    interface org.dom4j.Document

    • iterator  使用此法获取node
    • getRootElement  获取根节点

    interface org.dom4j.Node

    • getName  获取node名字,例如获取根节点名称为bookstore
    • getNodeType  获取node类型常量值,例如获取到bookstore类型为1——Element
    • getNodeTypeName  获取node类型名称,例如获取到的bookstore类型名称为Element

    interface org.dom4j.Element

    • attributes  返回该元素的属性列表
    • attributeValue  根据传入的属性名获取属性值
    • elementIterator  返回包含子元素的迭代器
    • elements  返回包含子元素的列表

    interface org.dom4j.Attribute

    • getName  获取属性名
    • getValue  获取属性值

    interface org.dom4j.Text

    • getText  获取Text节点值

    interface org.dom4j.CDATA

    • getText  获取CDATA Section值

    interface org.dom4j.Comment

    • getText  获取注释

    解析实例:

    1.先准备好一个xml文件,本文解析的是一个spring的配置文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
     3     "http://www.springframework.org/dtd/spring-beans.dtd">
     4 
     5     <beans>
     6         <bean id="productManager" class="com.yangyang.manager.product.impl.ProductManagerImpl">
     7             <property name="productDao" ref="productDao"></property>
     8             <property name="soDao" ref="soDao"></property>
     9         </bean>
    10         <bean id="contractManager" class="com.yangyang.manager.product.impl.ContractManagerImpl"  autowire="byName"/>    
    11     </beans>
    12     
    View Code

    2.第二步,添加dom4j的jar包到工程中,本文使用的jar版本是dom4j-1.6.1.jar

    3.第三补,编写解析xml文件的工具类

     1 package com.yangyang;
     2 
     3 import java.net.URL;
     4 import java.util.Iterator;
     5 
     6 import org.dom4j.Attribute;
     7 import org.dom4j.Document;
     8 import org.dom4j.Element;
     9 import org.dom4j.io.SAXReader;
    10 
    11 public class XmlParseUtil {
    12     
    13     @SuppressWarnings("rawtypes")
    14     public static void parseXml(String xmlPath){
    15         SAXReader saxReader=new SAXReader();
    16         Document document=null;
    17         try {
    18             document=saxReader.read(xmlPath);
    19             //获取根节点
    20             Element elementRoot=document.getRootElement();
    21             System.out.println("根节点名称:"+elementRoot.getName());
    22             //遍历根节点下面的节点
    23             for(Iterator elementIterator=elementRoot.elementIterator();elementIterator.hasNext();){
    24                 Element element=(Element)elementIterator.next();
    25                 //获取节点的信息,,包括节点的名称以及节点的属性信息
    26                 System.out.println("节点:"+element.getName());
    27                 for (Iterator attrIterator = element.attributeIterator(); attrIterator.hasNext();) {
    28                     Attribute attr=(Attribute)attrIterator.next();
    29                     //节点的属性信息
    30                     System.out.println("节点的属性名称为:"+attr.getName()+",值为:"+attr.getValue());
    31                     
    32                 }
    33                 //获取节点下的子节点
    34                 for (Iterator subElementiterator = element.elementIterator(); subElementiterator.hasNext();) {
    35                     Element subElement=(Element)subElementiterator.next();
    36                     //获取子节点的信息,包括子节点的名称以及子节点的属性信息
    37                     System.out.println("子节点:"+subElement.getName());
    38                     for (Iterator subElementAttrIterator = subElement.attributeIterator(); subElementAttrIterator.hasNext();) {
    39                         Attribute subElementAttr=(Attribute)subElementAttrIterator.next();
    40                         //子节点的属性信息
    41                         System.out.println("子节点的属性名称为:"+subElementAttr.getName()+",值为:"+subElementAttr.getValue());
    42                         
    43                     }
    44                     
    45                 }
    46             }
    47         } catch (Exception e) {
    48         }
    49     }
    50 }
    View Code

    4.编写测试方法来测试该工具类:

     1 package com.yangyang;
     2 import java.io.File;
     3 public class TestXmlParse {
     4 
     5     /**
     6      * @param args
     7      */
     8     public static void main(String[] args) {
     9         String xmlPath="src/com/yangyang/spring-service-product.xml";
    10         xmlPath=new File(xmlPath).getAbsolutePath();
    11         XmlParseUtil.parseXml(xmlPath);
    12     }
    13 
    14 }
    View Code

    可以看到控制台打印出:

    根节点名称:beans
    节点:bean
    节点的属性名称为:id,值为:productManager
    节点的属性名称为:class,值为:com.yangyang.manager.product.impl.ProductManagerImpl
    节点的属性名称为:lazy-init,值为:default
    节点的属性名称为:autowire,值为:default
    节点的属性名称为:dependency-check,值为:default
    子节点:property
    子节点的属性名称为:name,值为:productDao
    子节点的属性名称为:ref,值为:productDao
    子节点:property
    子节点的属性名称为:name,值为:soDao
    子节点的属性名称为:ref,值为:soDao
    节点:bean
    节点的属性名称为:id,值为:contractManager
    节点的属性名称为:class,值为:com.yangyang.manager.product.impl.ContractManagerImpl
    节点的属性名称为:autowire,值为:byName
    节点的属性名称为:lazy-init,值为:default
    节点的属性名称为:dependency-check,值为:default
    ----------------------------------------------------------------------------------------
    如果您觉得阅读本文对您有帮助,请微信扫码关注作者,与我进行交流!欢迎各位转载,转载文章之后须在文章页面明显位置给出作者和原文连接,谢谢。
  • 相关阅读:
    ctypes运用
    win10 下获取不到
    semantic ui加载慢的问题
    python 将图片转换为base64编码转储进数据库
    循环遍历共享文件夹,不需要知道目录深度拷贝上传
    计划和打算
    pyqt按键检测
    python B+数的实现
    JAVA算数运算符
    ASCLL码表
  • 原文地址:https://www.cnblogs.com/shunyang/p/3265100.html
Copyright © 2011-2022 走看看