上期文章回顾:【XML基础】
1.xml解析方式
解析xml文档:操作xml文档,将文档中的数据读取到内存中
操作xml文档
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中(持久化的存储)
解析xml 的方式:
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树
-
优点:操作方便,可以对文档进行CRUD的所有操作
-
缺点:占内存
- SAX:逐行读取,基于事件驱动的
-
优点:不占内存
-
缺点:只能读取逐条读取,不能增删改
xml常见的解析器
- JAXP:sun公司提供的解析器,支持DON和SAX两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jouery的操作方法来取出和操作数据。
- PULL:Android操作系统内置的解析器,SAX方式
- 提取码:1tcs
2.Jsoup解析器
Jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套井常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
Jsoup原本是解析HTML的,但是XML也是标记性语言,同样可以解析。
Jsoup解析步骤
- 导入jar包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据(文本内容等)
Jsoup解析xml文档Demo
stu.xml
<?xml version="1.0"encoding="UTF-8"?>
<students>
<student number="001">
<name id="xml01">tom</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="002">
<name id="xml02">jack</name>
<age>18</age>
<sex>female</sex>
</student>
</students>
JsoupDemo.java
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;
public class JsoupDemo {
public static void main(String[] args) throws IOException {
//1.获取Document对象,根据XML对象获取
//获取student.xml的path(类名)
String path = JsoupDemo.class.getClassLoader().getResource("stu.xml").getPath();
//2.解析xml文档,将文档加载如内存,获取DOM树
Document document = Jsoup.parse(new File(path),"utf-8");
//3.获取元素对象Element
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//获取第一个name的Element对象
Element element = elements.get(0);
//获取数据
String name = element.text();
System.out.println(name);
}
}
【解析结果】
I. 导入jar包
新建 libs目录,右击Add as Library
选择Module Library
II. Jsoup对象
对象的使用:
1.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的文档对象
解析xml字符串
public class JsoupObject_parse_String {
public static void main(String[] args) throws IOException {
//1.获取Document对象,根据XML对象获取
//获取student.xml的path
String path = JsoupDemo.class.getClassLoader().getResource("user.xml").getPath();
//2.解析xml文档,将文档加载如内存,获取DOM树
//parse(String html): 解析xml或html字符串
String str="<?xml version=\"1.0\"encoding=\"UTF-8\"?>\n"+
"\n"+
"<students>\n"+
"\t<student number=\"heima_e0e1\">\n"+
"\t\t<name>tom</name>\n"+
"\t\t<age>18</age>\n"+
"\t\t<sex>male</sex>\n"+
"\t</student>\n"+
"\t<student number=\"heima_0002\">\n"+
"\t\t<name>jack</name>\n"+
"\t\t<age>18</age>\n"+
"\t\t<sex>female</sex>\n"+
"\t</student>\n"+
"\n"+
"</students>";
//获取元素对象
Document document = Jsoup.parse(str);
System.out.println(document);
}
}
【解析结果】
解析url
public class JsoupObject_parse_URL {
public static void main(String[] args) throws IOException {
//1.获取Document对象,根据xml对象获取
//获取student.xml的path(类名)
String path = JsoupObject_parse_URL.class.getClassLoader().getResource("user.xml").getPath();
//2.解析xml文档,将文档加载如内存,获取DOM树
//parse(URL url,int timeoutMillins):通过网络路径获取指定的html或xml的文档对象
URL url = new URL("https://baike.sogou.com/v63211637.htm?fromTitle=jsoup");
Document doc = Jsoup.parse(url,10000);
System.out.println(doc);
}
}
【解析结果:获取的是F12网页源码】
解析URL其实在爬虫里面用的更广泛
2.Document:文档对象,代表内存中的DOM树
获取Elemet对象
-
getElementById(String id):根据id属性值获取唯一的element对象
-
getElementsByTag(String tagName):根据标签名称获取元素对象集合
-
getElementsByAttribute(String key):根据属性名称获取元素对象集合
-
getElementsByAttributeValue(String key,string value):根据对应的属性名和属性值获取元素对象集合
stu.xml

前两部的操作都是相同的
- 获取Document对象
- 将文档加载到内存中
然后便是获取想要的属性得到元素对象
3.Elements:元素Element对象的集合。可以当做ArrayList<Element>来使用
获取Element对象(同上一步的代码)
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;
/**
* @Author: Mr.Q
* @Date: 2020-01-21 11:08
* @Description:
*/
public class JsoupObject_Document {
public static void main(String[] args) throws IOException {
//1.获取Document对象,根据XML对象获取
//获取student.xml的path(类名)
String path = JsoupObject_Document.class.getClassLoader().getResource("stu.xml").getPath();
//2.解析xml文档,将文档加载如内存,获取DOM树
Document document = Jsoup.parse(new File(path),"utf-8");
//3.获取元素对象Element
//获取所有student对象
Elements elements = document.getElementsByTag("student");
System.out.println(elements);
//获取属性名为 id的元素对象
Elements eme = document.getElementsByAttribute("id");
System.out.println("**********************************");
System.out.println(eme);
//获取 number属性值为001的元素对象
Elements ele = document.getElementsByAttributeValue("number","001");
System.out.println("----------------------------------");
System.out.println(ele);
//获取id属性值的元素对象
Element msg = document.getElementById("xml01");
System.out.println("*****-----*****-----*****-----*****");
System.out.println(msg);
}
}
【获取所有student对象】
【获取属性名为 id的元素对象】

【获取 number属性值为001的元素对象】
【获取id属性值的元素对象】
4.Element:元素对象
a. 获取子元素对象
-
getElementById(string id):根据id属性值获取唯一的element对象
-
getElementsByTag(string tagName):根据标签名称获取元素对象集合
-
getElementsByAttribute(string key):根据属性名称获取元素对象集合
-
getElementsByAttributevalue(String key,string value):根据对应的属性名和属性值获取元素对象集合
Elements
获取的是所有students的name属性,所以为 2Element
获取的是所有student的name属性,所以为 1

b. 获取属性值
String attr(string attributekey)
:根据属性名称获取属性值
c. 获取文本内容
String text()
:获取文本内容
String html()
:获取标签体的所有内容(包括字标签的字符串内容)
【区别】text()
仅仅获取的是文本内容,html()
获取的是子标签的字符串表现形式
Element获取子元素对象
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;
/**
* @Author: Mr.Q
* @Date: 2020-01-26 11:56
* @Description:Element---获取子元素对象
*/
public class JsoupObject_Element {
public static void main(String[] args) throws IOException {
//1.获取Document对象,根据XML对象获取
//获取student.xml的path(类名)
String path = JsoupObject_Document.class.getClassLoader().getResource("stu.xml").getPath();
//2.解析xml文档,将文档加载如内存,获取DOM树
Document document = Jsoup.parse(new File(path),"utf-8");
//3.获取元素对象Element
//通过Document对象获取name标签,获取所有的name标签可以获取到两个
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
//通过Element对象获取student子标签对象
Element ele_stu = document.getElementsByTag("student").get(0);
Elements ele_name = ele_stu.getElementsByTag("name");
System.out.println(ele_name.size());
System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
//获取student子标签对象的属性值
String number = ele_stu.attr("number");
System.out.println(number);
System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
//获取文本内容
String text = ele_name.text();
String html = ele_name.html();
System.out.println(text);
System.out.println(html);
}
}
5.Node:节点对象是Document和Element的父类
3.快捷查询方式
selector选择器
使用的方法:Elements select(string cssouery)
语法:参考selector类中定义的语法
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
* @Author: Mr.Q
* @Date: 2020-01-21 14:17
* @Description:选择器查询
*/
public class Jsoup_selector {
public static void main(String[] args) throws IOException {
//1.获取Document对象,根据XML对象获取
//获取student.xml的path(类名)
String path = Jsoup_selector.class.getClassLoader().getResource("stu.xml").getPath();
//2.解析xml文档,将文档加载如内存,获取DOM树
Document document = Jsoup.parse(new File(path), "utf-8");
//查询 name标签
Elements elements = document.select("name");
System.out.println(elements);
//查询id值为 xml01的元素
Elements ele = document.select("#xml01");
System.out.println("\n**************************");
System.out.println(ele);
}
}
- 获取stu标签,并且获取 number—>001的 age子标签
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
* @Author: Mr.Q
* @Date: 2020-01-21 14:24
* @Description:Jsoup_选择器查询
* @获取stu标签,并且获取 number--->001的 age子标签
*/
public class Jsoup_selector_Demo {
public static void main(String[] args) throws IOException {
//1.获取Document对象,根据XML对象获取
//获取student.xml的path(类名)
String path = Jsoup_selector_Demo.class.getClassLoader().getResource("stu.xml").getPath();
//2.解析xml文档,将文档加载如内存,获取DOM树
Document document = Jsoup.parse(new File(path), "utf-8");
//获取stu标签number--->001的标签
Elements elements = document.select("student[number=\"001\"]");
System.out.println(elements);
//获取stu标签下的 number--->001的 age子标签
Elements ele = document.select("student[number=\"001\"] > age");
System.out.println("\n**************************");
System.out.println(ele);
}
}
【解析结果】

JsoupXpath解析
XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
-
使用Jsoup的Xpath需要额外导入jar包
-
Xpath W3School参考手册
首先要导入JsoupXpath-0.3.2.jar
包,同上
XPath查询
查询的结果放入到List集合中
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* @Author: Mr.Q
* @Date: 2020-01-21 14:56
* @Description:XPath查询
*/
public class Jsoup_Xpath {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
//1.获取Document对象,根据XML对象获取
//获取student.xml的path(类名)
String path = Jsoup_Xpath.class.getClassLoader().getResource("stu.xml").getPath();
//2.解析xml文档,将文档加载如内存,获取DOM树
Document document = Jsoup.parse(new File(path), "utf-8");
//3.根据Document创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//4.结合xpath语法查询
// **查询所有student标签
System.out.println("\n*-*-*-*-*-查询所有student标签*-*-*-*-*-*-");
List<JXNode> jxNodeList = jxDocument.selN("//student");
for (JXNode jxNode : jxNodeList) {
System.out.println(jxNode);
}
System.out.println("\n*-*-*-*-*-查询所有student标签下的name标签*-*-*-*-*-*-");
// **查询所有student标签下的name标签
List<JXNode> jxNodeList1 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodeList1) {
System.out.println(jxNode);
}
System.out.println("\n*-*-*-*-*-查询student标签下带有 id属性的name标签*-*-*-*-*-*-");
// **查询student标签下带有 id属性的name标签
List<JXNode> jxNodeList2 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodeList2) {
System.out.println(jxNode);
}
System.out.println("\n*-*-*-*查询student标签下带有 id属性的name标签,id属性值为xml01-*-*-*-");
// **查询student标签下带有 id属性的name标签,id属性值为xml01
List<JXNode> jxNodeList3 = jxDocument.selN("//student/name[@id='xml02']");
for (JXNode jxNode : jxNodeList3) {
System.out.println(jxNode);
}
}
}
【查询结果】
【参考文章】
来源:CSDN
作者:Mr.Q_
链接:https://blog.csdn.net/weixin_43232955/article/details/104083962