Jsoup 快速入门 Jsoup对象 Document对象 Elements对象 Element对象 Node对象 快捷查询方式
-
步骤:
- 导入 jar 包
- 获取 Document对象
- 获取对应的标签的 Element 对象
- 获取数据
-
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="heima_0001">
<name>zhangsan</name>
<age>20</age>
<sex>male</sex>
</student>
<student number="heima_0002">
<name>lisi</name>
<age>22</age>
<sex>female</sex>
</student>
</students>
- JsoupDemo1.java
package com.my.xml.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
* Jsoup快速入门
*/
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
// 1.导入jar包
// 2.获取Document对象,根据xml文档获取
// 2.1 获取xml文档的路径
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
// 2.2 解析xml文档,加载文档进内存,获取 dom 树 --> Document
Document document = Jsoup.parse(new File(path), "utf-8");
// 3. 获取元素Element
Elements elements = document.getElementsByTag("name");
// System.out.println(elements.size());
// 3.1 获取第一个name的element对象
Element element = elements.get(0);
// 3.2 获取数据
String name = element.text(); // 获取文本数据
System.out.println(name); // zhangsan
}
}
Jsoup对象
-
Jsoup:工具类,可以解析 html 或 xml 文档,返回 Document对象
- parse:解析 html 或 xml 文档,返回 Document
- parse(File in, String charsetName):解析 xml 或 html 文件的
- parse(String html):解析 xml 或 html 字符串
- parse(URL url, int timeoutMillis):通过网络路径获取指定的 html 或 xml 的文档对象
- parse:解析 html 或 xml 文档,返回 Document
- 示例:
package com.my.xml.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
import java.net.URL;
/**
* Jsoup对象
*/
public class JsoupDemo2 {
public static void main(String[] args) throws IOException {
// 1.parse(File in, String charsetName):解析 xml 或 html文件
/*
String path = JsoupDemo2.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
System.out.println(document);
*/
// 2.parse(String html)
/*
String str = "<?xml version="1.0" encoding="UTF-8" ?>
" +
"
" +
"<students>
" +
" <student number="heima_0001">
" +
" <name>zhangsan</name>
" +
" <age>20</age>
" +
" <sex>male</sex>
" +
" </student>
" +
"
" +
" <student number="heima_0002">
" +
" <name>lisi</name>
" +
" <age>22</age>
" +
" <sex>female</sex>
" +
" </student>
" +
"</students>
";
Document document = Jsoup.parse(str);
System.out.println(document);
*/
// 3.parse(URL url, int timeoutMillis):通过网络路径获取指定的 html
URL url = new URL("https://baike.baidu.com/item/jsoup");
Document document = Jsoup.parse(url, 10000);
System.out.println(document);
}
}
Document对象
-
Document:文档对象。代表内存中的 dom 树
- 获取Element对象
- getElementsByTag(String tagName):根据标签名获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
- getElementById(String id):根据 id 属性值获取唯一的 element 对象
- 获取Element对象
- 示例:
package com.my.xml.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
* Doucument(Element)对象
*/
public class JsoupDemo3 {
public static void main(String[] args) throws IOException {
// 获取student.xml的路径
String path = JsoupDemo2.class.getClassLoader().getResource("student.xml").getPath();
// 获取document对象
Document document = Jsoup.parse(new File(path), "utf-8");
// 1.获取所有 student 对象们
Elements elements = document.getElementsByTag("student");
System.out.println(elements);
System.out.println("===============");
// 2.获取属性名为 id 的元素对象们
Elements elements1 = document.getElementsByAttribute("id");
System.out.println(elements1);
System.out.println("===============");
// 3.获取属性名为number,属性值为heima_0001的元素
Elements elements2 = document.getElementsByAttributeValue("number", "heima_0001");
System.out.println(elements2);
System.out.println("===============");
// 4.获取id为name的对象
Element element = document.getElementById("name");
System.out.println(element);
}
}
Elements对象
-
Elements:元素 Element 对象的集合。可以当作
ArrayList<Element>
来使用
Element对象
- Element:元素对象
-
获取子元素对象
- getElementsByTag(String tagName):根据标签名获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
- getElementById(String id):根据 id 属性值获取唯一的 element 对象
-
获取属性值
- String attr(String attributeKey):根据属性名称获取属性值
-
获取文本内容
- String text():获取所有子标签的纯文本内容
- String html():获取标签体的所有内容(包括子标签标签和文本内容)
-
Node对象
- Node:节点对象
- 是 Document 和 Element 的父类
快捷查询方式
-
selector:选择器
- 使用的方法:Elements select(String cssQuery)
- 语法:参考 Selector 类中定义的语法
- 使用的方法:Elements select(String cssQuery)
-
XPath:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。
- 使用 Jsoup 的Xpath 需要额外导入 jar 包
- 查询 W3cshool 参考手册,使用XPath的语法完成查询
- 示例:
package com.my.xml.jsoup;
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.IOException;
/**
* XPath查询
*/
public class JsoupDemo6 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
// 1.获取student.xml的path
String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
// 2.获取Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
// 3.根据 Document对象,获取 JXDocument对象
JXDocument jxDocument = new JXDocument(document);
// 4.结合Xpath语法查询
// 4.1 查询所有的student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("--------------");
// 4.2 查询所有student标签下的 name 标签
List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes1) {
System.out.println(jxNode);
}
System.out.println("--------------");
// 4.3 查询所有student标签下带有id属性值的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("--------------");
// 4.4 查询所有student标签下带有id属性值的name标签,并且id属性值为 itcast
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='itcast']");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
}
}