Ngbatis源码中Jsoup如何简单使用?
摘要:在 Ngbatis 中解析 xml 的工具是 Jsoup,因为之前没有接触过,在这里简要的介绍和编写一下。 查了一些资料,Jsoup 似乎用作爬虫和解析 HTML 的场景比较多, 但是 XML 是一样的,同样是将页面解析为一个 DOM 树,
在 Ngbatis 中解析 xml 的工具是 Jsoup,因为之前没有接触过,在这里简要的介绍和编写一下。
查了一些资料,Jsoup 似乎用作爬虫和解析 HTML 的场景比较多, 但是 XML 是一样的,同样是将页面解析为一个 DOM 树,然后使用 Jsoup 提供的方法来查询。因为 Jsoup 的解析查询方法十分直观,且能快速上手,因为这个原因所以在 Ngbatis 中选择了 Jsoup 的方式。
源码地址
Jsoup 在 GitHub 上的源码地址:https://github.com/jhy/jsoup
使用方式
引入 Jsoup 的依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.4</version>
</dependency>
之前已经将 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);
}
解析成 Document 对象之后,这个 Document 对象其实就是一整个 XML 文件,通过 Document 的各种 getElement* 方法来获取 XML 内部的标签内容,即得到的 Elements 或 Element 对象就是一个个 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 有初步的认识,能够使用调用相关方法即可。
