XML入门(三)——XML解析器

611 阅读5分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。

前言

大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要介绍XML的两种常见的解析规范以及常用的解析器,和Jsoup解析器的详细介绍以及如何使用。

1. XML解析器

1.1 XML解析技术

解析XML其实就是把XML文档加载到内存中处理,XML解析规范有两种,分别是DOM和SAX。

1.1.1 DOM

通过DOM方式解析XML,需要把XML文档一次全部加载到内存中,把文档元素作为一个dom树,通过Document对象操作元素,可以进行CRUD操作。

  • 优点:文档的结构清晰,可以进行CRUD操作。
  • 缺点:需要较大的内存。

1.1.2 SAX

通过SAX方式解析XML,是对XML一行一行读取加载到内存中,基于事件驱动的,当SAX读取一行数据后,会通知用户读取到的信息,用户根据返回的信息完成对应的业务逻辑。当整个文档读取结束后,SAX不会保存任何数据,也就是说,SAX读一行丢一行,在读取过程中,内存中永远只存在一行数据。

  • 优点:占用内存少。
  • 缺点:不能保存文档结构,不能进行增删改,只能进行读取。

1.2 常见的XML解析器

所谓XML解析器其实就是对DOM和SAX解析规范(接口)的具体实现(类)。

以下3种解析器大家了解即可,我们主要介绍最后一种。

  1. JAXP:JAXP是由sun公司提供的,用于隐藏底层解析器。JAXP本身并不是解析器,而是通过特定的方式去查找解析器来解析XML文档,JAXP支持DOM和SAX两种规范。
  2. DOM4J:DOM4J是一款优秀的开源解析器,支持JAXP,DOM和SAX。
  3. PULL::PULL是安卓系统内置的XML文档解析器。支持SAX。

最后一种也是我们重点介绍的一种:JSoup解析器。

1.3 JSoup解析器

1.3.1 Jsoup简介

先引用百度百科(baike.baidu.com/item/jsoup/…)的介绍:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

jsoup能够解析html,当然也能够解析html同根的xml。

1.3.2 Jsoup使用

在了解Jsoup具体使用前,我们先来了解一些类,方便我们后面更好理解使用Jsoup。

4.3.2.1 Jsuop

Jsoup是用来HTML或XML解析为Doucment文档的工具类。

需要我们关注的就是它的许多重载的parse方法。

static Document parse•(File file, String charsetName)
    根据文件和字符集将XML文档解析为Dcoument
static Document parse•(String html)
    将XML字符串解析为Document
static Document parse•(URL url, int timeoutMillis)
    根据URL,将XML文档解析为Document,第二个参数表示连接和读取超时的时间(毫秒为单位),如果超过该时间,则抛出IO异常。

官方文档链接:jsoup.org/apidocs/org…

1.3.2.2 Document

Document也就是一颗dom树,我们可以通过Document类来对元素进行操作。

需要我们注意的就是它的用来获取Element对象的方法,这些方法都是从它的父类Element继承而来。

Element   getElementById•(String id)
    按照id查找元素
Elements  getElementsByTag•(String tagName)
    按照标签名称查找元素
Elements  getElementsByAttribute•(String key)
    按照属性名称查找元素
Elements  getElementsByAttributeValue•(String key, String value)
    按照属性名和属性值查找元素

官方文档链接:jsoup.org/apidocs/org…

1.3.2.3 Element

XML元素,可以通过Element来提取数据,操作XML。

Element是Document类的父类,除了上述Document的四个方法之外我们还需要了解以下方法:

String attr(String key)(继承自Node)
    根据属性名称获取属性值
String text()
    获取此元素和其子元素的文本内容。
String html()
    获取标签体的所有内容(包括字标签的字符串内容)

官方文档链接:jsoup.org/apidocs/org…

1.3.2.4 Elements

Elements实际上就是ArrayList集合,泛型是Element。

1.3.2.5 Node

抽象类,节点模型。Element和Document都是Node的实例。

1.3.2.6 Jsoup使用

使用步骤:

  1. 导入jar包。
  2. 通过parse方法获取Document对象。
  3. 通过getElementXXX获取Elements集合。
  4. 通过Elements获取Element元素。

【实例展示】

//获取Document对象
Document document = Jsoup.parse(new File("F:\Demo\JavaWebDemo\JavaWebStudyDemo\xml\src\main\java\com\example\jsoup\test.xml"), "utf-8");
//获取Elements
Elements elements = document.getElementsByTag("dept");
Element element = elements.get(0);
System.out.println(element.select("id"));

1.3.3 Jsoup查询XML元素

1.3.3.1 通过select查找元素

通过Elements种的select方法来获取具体的Element。

public Elements select•(String cssQuery)
    找到与Selector CSS查询匹配的元素

查询语法:

//查询指定标签名
select("tagName");
//查询指定id
select("#id");
//查询指定class
select(".className");
//查询所有子元素
select("div a");
//查询直接子元素
select("div > a");

官方文档链接:jsoup.org/apidocs/org…

1.3.3.2 通过Xpath查找元素

官方解释:XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

常用查询语法:

//选取标签的所有子元素
    //标签名
//选取根元素 bookstore。
    /标签名
//选取标签子元素的第一个元素。
    /标签名/子元素[1]
//选取标签子元素的最后一个元素。
    /标签名/子元素[last()]

语法链接:www.w3school.com.cn/xpath/xpath…

小结

以上就是XML解析器的一些介绍,以及Jsoup解析器的使用,希望能对读者有所帮助,如有不正之处,欢迎留言指正。