Dom4j框架的学习

Dom4j

XML解析

解析概述

​ 当将数据存储在XML后,我们就希望通过程序获取XML的内容。如果我们使用Java基础所学的IO知识是可以完成的,不过你学要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。人们为不同问题提供不同的解析方式,使用不同的解析器进行解析,方便开发人员操作XML。

解析方式和解析器

  • 开发中比较常见的解析方式有三种,如下:

    1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象

      a)优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

      b)缺点:XML文档过大,可能出现内存溢出

    2. SAX:是一种速度更快,更有效的方法。她逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,没执行一行,都触发对应的事件。(了解)

      a)优点:处理速度快,可以处理大文件

      b)缺点:只能读,逐行后将释放资源,解析操作繁琐。

    3. PULL:Android内置的XML解析方式,类似SAX。(了解)

  • 解析器,就是根据不同的解析方式提供具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包

在这里插入图片描述

  • 常见的解析开发包

    • JAXP:sun公司提供支持DOM和SAX开发包
    • Dom4j:比较简单的的解析开发包(常用)
    • JDom:与Dom4j类似
    • Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便(项目中讲解)

Dom4j的基本使用

DOM解析原理及结构模型

  • 解析原理

    XML DOM 和 HTML DOM一样,XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。以下面books.xml文档为例。

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
        <book id="0001">
            <name>JavaWeb开发教程</name>
            <author>张孝祥</author>
            <sale>100.00元</sale>
        </book>
        <book id="0002">
            <name>三国演义</name>
            <author>罗贯中</author>
            <sale>100.00元</sale>
        </book>
    </books>
    
  • 结构模型

在这里插入图片描述

DOM中的核心概念就是节点,在XML文档中的元素、属性、文本,在DOM中都是节点!所有的节点都封装到了Document对象中。

  • 引入dom4j的jar包

    需要引入“jar/dom4j-1.6.1.jar” , 在IDEA中,选择项目鼠标右键—>弹出菜单–>open Module settings”–>Dependencies–>±->JARs or directories…

    找到dom4j-1.6.1.jar,成功添加之后点击"OK" 即可.

  • dom4j 必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以操作了。

常用的方法

SaxReader对象
方法作用
new SaxReader()构造器
Document read(String url)加载执行xml文档
Document对象
方法作用
Element getRootElement()获得根元素
Element对象
方法作用
List elements([String ele] )获得指定名称的所有子元素。可以不指定名称
Element element([String ele])获得指定名称第一个子元素。可以不指定名称
String getName()获得当前元素的元素名
String attributeValue(String attrName)获得指定属性名的属性值
String elementText(Sting ele)获得指定名称子元素的文本值
String getText()获得当前元素的文本内容

方法演示

复制资料下的常用xml中"books.xml",内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="0001">
        <name>JavaWeb开发教程</name>
        <author>张孝祥</author>
        <sale>100.00元</sale>
    </book>
    <book id="0002">
        <name>三国演义</name>
        <author>罗贯中</author>
        <sale>100.00元</sale>
    </book>
</books>

注意:为了便于解析,此xml中没有添加约束

解析此文件,获取每本书的id值,以及书本名称,作者名称和价格.

public class Demo {
    public static void main(String[] args) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(Demo.class.getResourceAsStream("/books.xml"));
        //获取根元素 books
        Element elemRoot = document.getRootElement();

        //获取根元素的所有子元素 book
        List<Element>list = elemRoot.elements();
        //遍历集合 获取每一个book
        for(Element element : list){
            //获取book的id属性
            String id =element.attributeValue("id");
            System.out.println("id : "+ id);

            //获取book下的所有子元素 name,author,sale
            List<Element>listElem = element.elements();
            //遍历集合 获取每一个子元素
            for(Element elem : listElem){
                //元素名
                String name = elem.getName();
                //文本值
                String text = elem.getText();
                System.out.println("--- " + name + " : " + text);
            }
        }
    }
}

Dom4J结合XPath解析XML

介绍

​ XPath 使用路径表达式来选取HTML 文档中的元素节点或属性节点。节点是通过沿着路径 (path) 来选取的。XPath在解析HTML文档方面提供了一独树一帜的路径思想。

XPath使用步骤

步骤1:导入jar包(dom4j和jaxen-1.1-beta-6.jar)

步骤2:通过dom4j的SaxReader获取Document对象

步骤3: 利用Xpath提供的api,结合xpaht的语法完成选取XML文档元素节点进行解析操作。

document常用的api

方法作用
List selectNodes(“表达式”)获取符合表达式的元素集合
Element selectSingleNode(“表达式”)获取符合表达式的唯一元素

XPath语法(了解)

  • XPath表达式,就是用于选取HTML文档中节点的表达式字符串。

    获取XML文档节点元素一共有如下4种XPath语法方式:

    1. 绝对路径表达式方式 例如: /元素/子元素/子子元素…
    2. 相对路径表达式方式 例如: 子元素/子子元素… 或者 ./子元素/子子元素…
    3. 全文搜索路径表达式方式 例如: //子元素//子子元素
    4. 谓语(条件筛选)方式 例如: //元素[@attr1=value]
  • 获取不同节点语法

    获取类型语法代码
    获取元素节点元素名称
    获取属性节点@属性名称
绝对路径表达式(了解)
  • 绝对路径介绍

    格式: String xpath="/元素/子元素/子子元素…";

    ​ 绝对路径是以“/”开头,一级一级描述标签的层级路径就是绝对路径,这里注意不可以跨层级

    ​ 绝对路径是从根元素开始写路径的,这里开头的“/”代表HTML文档根元素,所以在绝对路径中不可以写根元素路径

  • 演示需求(解析XML文档为"资料\常用xml文件\index.html")

    需求:采用绝对路径获取从根节点开始逐层的html/body/div/ul/li节点列表并打印信息
    
相对路径表达式(了解)
  • 相对路径介绍

    格式: String xpath1=“子元素/子子元素…”;//获取相对当前路径元素里面的子元素的选取

    ​ String xpath2="./子元素/子子元素";//"./"代表当前元素路径位置

    ​ String xpath3="/子元素/子子元素";//功能与xpath1格式功能一样

    ​ 相对路径就是相对当前节点元素位置继续查找节点,需要使用JXNode.sel(xpath)进行执行相对路径表达式。

全文搜索路径表达式
  • 全文搜索路径介绍

    格式: String xpath1="//子元素//子子元素";

    ​ 一个“/”符号,代表逐级写路径

    ​ 2个“//”符号,不用逐级写路径,可以直接选取到对应的节点,是全文搜索匹配的不需要按照逐层级

谓语(条件筛选)
  • 介绍

    谓语,又称为条件筛选方式,就是根据条件过滤判断进行选取节点

    格式:
    ​ String xpath1="//元素[@attr1=value]";//获取元素属性attr1=value的元素

    ​ String xpath2="//元素[@attr1>value]/@attr1"//获取元素属性attr1>value的d的所有attr1的值

    ​ String xpath3="//元素[@attr1=value]/text()";//获取符合条件元素体的自有文本数据

    String xpath4="//元素[@attr1=value]/html()";//获取符合条件元素体的自有html代码数据。

    ​ String xpath3="//元素[@attr1=value]/allText()";//获取符合条件元素体的所有文本数据(包含子元素里面的文本)

演示

public class DemoXpath {
    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(Demo.class.getResourceAsStream("/books.xml"));
        //获取所有的book元素
        List<Element> list = document.selectNodes("//book");
        for (Element ele: list) {
            System.out.println(ele.attributeValue("id"));
        }

       //获取id为0002的指定book元素的子标签name的内容
        Element ele = (Element)document.selectSingleNode("//book[@id='0002']/name");
        System.out.println(ele.getText());
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值