一、Jsoup 解析步骤
Jsoup中文帮助API:https://www.open-open.com/jsoup/
步骤:
1、导入 jar 包(官网下载地址:Jsoup官网)
2、解析 XML文件
① 得到解析文件的路径:类加载器加载文件的路径
② 构建一个 File 对象
③ 调用 Jsoup 的 parse 方法解析 XML 文件得到一个 Document 对象
④ 调用 Document 的相关方法得到相关的标签对象(Element),Element 就是一个存放了 Element 对象的 ArrayList 集合
⑤ 调用 Element 的相关方法获取数据
XML 文件:
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
3 <students>
4 <student number="0001">
5 <name id="java">tom</name>
6 <age>18</age>
7 <sex>male</sex>
8 </student>
9 <student number="0002">
10 <name>jack</name>
11 <age>18</age>
12 <sex>female</sex>
13 </student>
14 </students>
解析 XML:
1 package com.ks.jsoup;
2
3 import org.jsoup.Jsoup;
4 import org.jsoup.nodes.Document;
5 import org.jsoup.nodes.Element;
6 import org.jsoup.select.Elements;
7
8 import java.io.File;
9 import java.io.IOException;
10
11 /**
12 * xml_解析_Jsoup_快速入门
13 * <p>
14 * 步骤:
15 * 1,导入JAR
16 * 2,解析XML文件
17 * A,得到解析文件的路径:类加载器加载文件的路径
18 * B,构建一个FILE对象
19 * C,调用JSOUP的PARSE方法解析XML文件得到一个DOCUMENT对象
20 * D,调用Document的相关方法得到相关的标签对象(Element)
21 * Elements:就是一个存了Element对象的ArrayList集合
22 * E ,调用Element的相关方法得到想要的数据
23 */
24 public class JsoupDemo1 {
25 public static void main(String[] args) throws IOException {
26 //1.获取xml解析文件的路径
27 String path = JsoupDemo1.class.getClassLoader().getResource( "xml/student.xml" ).getPath();
28 //2.解析xml文档,加载文档进内存,获取 dom 树 --》获取document对象
29 Document document = Jsoup.parse(new File( path ),"UTF-8");
30 //3.获取元素对象Element,返回值是存了Element对象的ArrayList集合
31 Elements name = document.getElementsByTag( "name" );
32 System.out.println(name.size());
33 //4.获取第一个name的Element对象
34 Element element = name.get( 0 );
35 //5.获取数据
36 String text = element.text();
37 System.out.println(text);
38 }
39 }
二、Jsoup 对象的使用
1、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的文档对象
Demo:
1 package jsoup;
2 /**
3 * Jsoup对象功能
4 */
5
6 import org.jsoup.Jsoup;
7 import org.jsoup.nodes.Document;
8
9 import java.io.File;
10 import java.io.IOException;
11 import java.net.URL;
12
13 public class JsoupDemo2 {
14 public static void main(String[] args) throws IOException {
15 //获取xml解析文件的路径
16 String path = JsoupDemo1.class.getClassLoader().getResource( "xml/student.xml" ).getPath();
17
18 //1.解析xml文档,加载文档进内存,获取document对象
19 Document document = Jsoup.parse(new File( path ),"UTF-8");
20
21 //2.parse(String html):解析xml或HTML字符串
22 String str="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
" +
23 "
" +
24 "<students>
" +
25 " <student number="0001">
" +
26 " <name>tom</name>
" +
27 " <age>18</age>
" +
28 " <sex>male</sex>
" +
29 " </student>
" +
30 " <student number="0002">
" +
31 " <name>jack</name>
" +
32 " <age>18</age>
" +
33 " <sex>female</sex>
" +
34 " </student>
" +
35 "</students>";
36 Document document1 = Jsoup.parse( str );
37 // System.out.println(document1);
38
39 //3.parse(URL url ,int timeoutMillis):通过网络路径获取指定的HTML或xml文档对象
40 URL url=new URL("https:www.baidu.com");
41 Document document2 = Jsoup.parse( url,10000);
42 // System.out.println(document2);
43
44
45 }
46 }
2、Document 对象
Document对象:文档对象,代表内存中的 dom 树
获取 Element 对象的方法:
getElementById(String id):根据id属性值获取唯一的element对象
getElementsByTag(String tagName):根据标签名称获取元素对象集合
getElementsByAttribute(String key):根据属性名称获取元素对象集合
getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
Demo:
1 package com.ks.jsoup;
2
3 import org.jsoup.Jsoup;
4 import org.jsoup.nodes.Document;
5 import org.jsoup.select.Elements;
6
7 import java.io.File;
8 import java.io.IOException;
9
10 /**
11 *Document/Elements对象
12 */
13 public class JsoupDomo3 {
14 public static void main(String[] args) throws IOException {
15 String path = JsoupDomo3.class.getClassLoader().getResource( "xml/student.xml" ).getPath();
16 Document document = Jsoup.parse( new File( path ), "UTF-8" );
17
18 //1.获取所有的student对象
19 Elements student = document.getElementsByTag( "student" );
20 System.out.println(student);
21 System.out.println("========================");
22
23 //2.获取id属性的元素对象
24 Elements id = document.getElementsByAttribute( "id" );
25 System.out.println(id);
26 System.out.println("========================");
27
28 //3.根据id属性值获取唯一的element对象
29 Elements value = document.getElementsByAttributeValue( "id", "itcast" );
30 System.out.println(value);
31 }
32 }
3、Elements
Elements:元素 Element 对象的集合,可以当做 ArrayList<Element> 来使用
4、Element 对象
Element 表示元素对象
(1)获取子元素对象的方法
getElementById(String id):根据id属性值获取唯一的element对象
getElementsByTag(String tagName):根据标签名称获取元素对象集合
getElementsByAttribute(String key):根据属性名称获取元素对象集合
getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
(2)获取属性值的方法
String attr(String key):根据属性名称获取属性值
(3)获取文本内容
String text():获取所有子标签的纯文本内容
String html():获取标签体的所有内容(包括子标签和标签里面的内容的字符串内容)
Demo:
1 package com.ks.jsoup;
2
3 import org.jsoup.Jsoup;
4 import org.jsoup.nodes.Document;
5 import org.jsoup.nodes.Element;
6 import org.jsoup.select.Elements;
7
8 import java.io.File;
9 import java.io.IOException;
10
11 /**
12 * Element对象
13 */
14 public class JsoupDemo4 {
15 public static void main(String[] args) throws IOException {
16 String path = JsoupDemo4.class.getClassLoader().getResource( "xml/student.xml" ).getPath();
17 Document document = Jsoup.parse( new File( path ), "UTF-8" );
18
19 //通过document获取所有的name标签,可以获取两个
20 Elements name = document.getElementsByTag( "name" );
21 System.out.println(name.size());
22
23 //通过element对象子标签对象,可以获取一个
24 Element ele_Student = document.getElementsByTag( "name" ).get( 0 );
25 Elements els_name = ele_Student.getElementsByTag( "name" );
26 System.out.println(els_name.size());
27
28 //获取student对象的属性值
29 String number = ele_Student.attr( "number" );
30 System.out.println(number.length());
31 //获取文本内容
32 String text = els_name.text();
33 String html = els_name.html();
34 System.out.println(text);
35 System.out.println(html);
36 }
37 }
5、Node 对象
Node 表示节点对象,是 Document 和 Element 的父类
三、Jsoup 快捷查询方式
1、selector 选择器
使用的方法:Elements
Elements select(String cssQuery)
详细语法,参考 JavaAPI中 Selector 类中定义的语法。
Demo:
1 import org.jsoup.Jsoup;
2 import org.jsoup.nodes.Document;
3 import org.jsoup.nodes.Element;
4 import org.jsoup.select.Elements;
5
6 import java.io.File;
7 import java.io.IOException;
8
9 /**
10 *选择器查询
11 */
12 public class JsoupDemo {
13 public static void main(String[] args) throws IOException {
14 //1.获取student.xml的path
15 String path = JsoupDemo5.class.getClassLoader().getResource("student.xml").getPath();
16 //2.获取Document对象
17 Document document = Jsoup.parse(new File(path), "utf-8");
18
19 //3.查询name标签
20
21 Elements elements = document.select("name");
22 System.out.println(elements);
23 System.out.println("=----------------");
24 //4.查询id值为java的元素
25 Elements elements1 = document.select("#java");
26 System.out.println(elements1);
27 System.out.println("----------------");
28 //5.获取student标签并且number属性值为java_0001的age子标签
29 //5.1.获取student标签并且number属性值为java_0001
30 Elements elements2 = document.select("student[number="java_0001"]");
31 System.out.println(elements2);
32 System.out.println("----------------");
33
34 //5.2获取student标签并且number属性值为java_0001的age子标签
35 Elements elements3 = document.select("student[number="java_0001"] > age");
36 System.out.println(elements3);
37
38 }
39
40 }
2、XPath
XPath 即为 xml 路径语言,它是一种用来确定 xml(标准通用标记语言的子级)文档中某部分位置的语言
使用步骤:
(1)使用 Jsoup 的 Xpath 需要额外导入 jar 包。
(2)使用 Xpath 语法完成查询。XPath 语法
Demo:
1 import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
2 import cn.wanghaomiao.xpath.model.JXDocument;
3 import cn.wanghaomiao.xpath.model.JXNode;
4 import org.jsoup.Jsoup;
5 import org.jsoup.nodes.Document;
6 import org.jsoup.select.Elements;
7 import java.io.File;
8 import java.io.IOException;
9 import java.util.List;
10
11 /**
12 *XPath查询
13 */
14 public class JsoupDemo6 {
15 public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
16 //1.获取student.xml的path
17 String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
18 //2.获取Document对象
19 Document document = Jsoup.parse(new File(path), "utf-8");
20
21 //3.根据document对象,创建JXDocument对象
22 JXDocument jxDocument = new JXDocument(document);
23
24 //4.结合xpath语法查询
25 //4.1查询所有student标签
26 List<JXNode> jxNodes = jxDocument.selN("//student");
27 for (JXNode jxNode : jxNodes) {
28 System.out.println(jxNode);
29 }
30
31 System.out.println("--------------------");
32
33 //4.2查询所有student标签下的name标签
34 List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
35 for (JXNode jxNode : jxNodes2) {
36 System.out.println(jxNode);
37 }
38
39 System.out.println("--------------------");
40
41 //4.3查询student标签下带有id属性的name标签
42 List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
43 for (JXNode jxNode : jxNodes3) {
44 System.out.println(jxNode);
45 }
46 System.out.println("--------------------");
47 //4.4查询student标签下带有id属性的name标签 并且id属性值为java
48
49 List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='java']");
50 for (JXNode jxNode : jxNodes4) {
51 System.out.println(jxNode);
52 }
53 }
54
55 }