微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jsoup

目录

快速入门

<?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 的文档对象
  • 示例:
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\" ?>\n" +
                "\n" +
                "<students>\n" +
                "    <student number=\"heima_0001\">\n" +
                "        <name>zhangsan</name>\n" +
                "        <age>20</age>\n" +
                "        <sex>male</sex>\n" +
                "    </student>\n" +
                "\n" +
                "    <student number=\"heima_0002\">\n" +
                "        <name>lisi</name>\n" +
                "        <age>22</age>\n" +
                "        <sex>female</sex>\n" +
                "    </student>\n" +
                "</students>\n";
        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 对象
  • 示例:
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对象

Node对象

  • Node:节点对象
    • 是 Document 和 Element 的父类

快捷查询方式

  1. selector:选择器
    • 使用的方法:Elements select(String cssQuery)
      • 语法:参考 Selector 类中定义的语法
  2. 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);
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。