一、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 }