[Ngbatis源码学习] Ngbatis 源码阅读之 Jsoup 简单使用说明

Ngbatis 中解析 xml 的工具是 Jsoup,因为之前没有接触过,在这里简要的介绍和编写一下。
查了一些资料,Jsoup 似乎用作爬虫和解析 HTML 的场景比较多, 但是 XML 是一样的,同样是将页面解析为一个 DOM 树,然后使用 Jsoup 提供的方法来查询。因为 Jsoup 的解析查询方法十分直观,且能快速上手,因为这个原因所以在 Ngbatis 中选择了 Jsoup 的方式。

源码地址

JsoupGitHub 上的源码地址:https://github.com/jhy/jsoup

使用方式

  1. 引入 Jsoup 的依赖
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.15.4</version>
</dependency>
  1. 之前已经将 XML 文件数据加载到了 Resource 中,从 Resource 中获取 InputStream 流,并使用 Jsoup 解析成 Document 对象操作。这里使用的是 Jsoup.parse 这个方法。
Document doc = Jsoup.parse(resource.getInputStream(), "UTF-8", "http://example.com/");

其实 Jsoup.parse 有很多重载方法,可以接受 File 类型数据,也可以接受 html 文本字符串,按照需要调用方法即可。简要列出相关 Jsoup.parse 方法:

  public static Document parse(String html, String baseUri) {
    return Parser.parse(html, baseUri);
  }

  public static Document parse(String html, String baseUri, Parser parser) {
    return parser.parseInput(html, baseUri);
  }

  public static Document parse(String html, Parser parser) {
    return parser.parseInput(html, "");
  }

  public static Document parse(String html) {
    return Parser.parse(html, "");
  }

  public static Document parse(File file, @Nullable String charsetName, String baseUri) throws IOException {
    return DataUtil.load(file, charsetName, baseUri);
  }

  public static Document parse(File file, @Nullable String charsetName) throws IOException {
    return DataUtil.load(file, charsetName, file.getAbsolutePath());
  }

  public static Document parse(File file) throws IOException {
    return DataUtil.load(file, (String)null, file.getAbsolutePath());
  }

  public static Document parse(File file, @Nullable String charsetName, String baseUri, Parser parser) throws IOException {
    return DataUtil.load(file, charsetName, baseUri, parser);
  }

  public static Document parse(@WillClose InputStream in, @Nullable String charsetName, String baseUri) throws IOException {
    return DataUtil.load(in, charsetName, baseUri);
  }

  public static Document parse(InputStream in, @Nullable String charsetName, String baseUri, Parser parser) throws IOException {
    return DataUtil.load(in, charsetName, baseUri, parser);
  }
  1. 解析成 Document 对象之后,这个 Document 对象其实就是一整个 XML 文件,通过 Document 的各种 getElement* 方法来获取 XML 内部的标签内容,即得到的 ElementsElement 对象就是一个个 XML 的标签内容。

    举个栗子:

// 获取所有 mapper 标签内容
Elements elementsByTag = doc.getElementsByTag("mapper");
for (Element element : elementsByTag) {
    // ... ... 
}

Element 元素也可以通过调用 childNodes 方法来获取 Node 节点对象相关信息。
稍微翻了一下源码,Element 元素继承自 Node 节点,按照我的理解,其实 Node 节点对象与 Element 元素对象都可以表示 XML 标签,但是 Node 节点更通用一点,定义了一组例如获取父节点、子节点、兄弟节点等的方法,而 Element 添加了更多扩展或特定方法,比如获取标签名、属性、获取文本内容等。
Ngbatis 中对于 Jsoup 的使用也是只用到了这些对象与相关方法,只用作解析 XML 文件获取 XML 中的相关内容,也并未使用到更复杂的操作,所以在这里只需要对 Jsoup 有初步的认识,能够使用调用相关方法即可。

posted @ 2024-06-13 00:03  knqiufan  阅读(32)  评论(0编辑  收藏  举报