XML 解析器 — Jsoup

一、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\"?>\n" +
23                 "\n" +
24                 "<students>\n" +
25                 "\t<student number=\"0001\">\n" +
26                 "\t\t<name>tom</name>\n" +
27                 "\t\t<age>18</age>\n" +
28                 "\t\t<sex>male</sex>\n" +
29                 "\t</student>\n" +
30                 "\t<student number=\"0002\">\n" +
31                 "\t\t<name>jack</name>\n" +
32                 "\t\t<age>18</age>\n" +
33                 "\t\t<sex>female</sex>\n" +
34                 "\t</student>\n" +
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 }
View Code

  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 }
View Code

  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 }
View Code

  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 }

 

猜你喜欢

转载自www.cnblogs.com/niujifei/p/12404562.html