XML解析——Jsoup解析器

目录


Jsoup概念

跳转到目录

  • jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。
Jsoup基本使用
    public static void getFirstName() throws Exception{
        /*
        * 1. 获取Document对象
        * 2. 获取student.xml的path
        * 3. 解析xml文档 parse(url, charsetName)
        * 4. 获取元素对象Element
        * 5. 根据下标获取第一个name
        * 6. 使用text()方法获取元素的内容
        * */
        //2.获取Document对象,根据xml文档获取
        //2.1获取student.xml的path
        String path = TestJsoup.class.getClassLoader().getResource("com/sunny/xml/stu.xml").getPath();
        //2.2解析xml文档,加载文档进内存,获取dom树--->Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.获取元素对象 Element
        Elements elements = document.getElementsByTag("name");

        //3.1获取第一个name的Element对象
        Element element = elements.get(1);
        //3.2获取数据
        String name = element.text();
        System.out.println(name);
    }
Jsoup中的对象

跳转到目录

  • Jsoup: 工具类,可以解析html或xml文档,返回Document
  • 获取Document对象
    • parse​(File in, String charsetName):解析xml或html文件的。
    • parse​(String html):解析xml或html字符串
    • parse​(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
  • 获取对应的标签 Element 对象
    • getElementById​(String id):根据id属性值获取唯一的element对象
    • getElementsByTag​(String tagName):根据标签名称获取元素对象集合
    • getElementsByAttribute​(String key):根据属性名称获取元素对象集合
    • getElementsByAttributeValue​(String key, String value):根据对应的属性名和属性值获取元素对象集合
    • 获取属性值
      • String attr(String key):根据属性名称获取属性值
    • 获取文本内容
      • String text():获取文本内容
      • String html():获取标签体的所有内容(包括字标签的字符串内容)
  • Node: 节点对象. 是Document和Element的父类
public class TestJsoup {
    public static void main(String[] args) throws Exception{
//        getFirstName();
//        parseString();
//        parseURL();
        getElements();

    }

    // 获取第一个name元素的值
    public static void getFirstName() throws Exception{
        /*
        * 1. 获取Document对象
        * 2. 获取student.xml的path
        * 3. 解析xml文档 parse(url, charsetName)
        * 4. 获取元素对象Element
        * 5. 根据下标获取第一个name
        * 6. 使用text()方法获取元素的内容
        * */
        //2.获取Document对象,根据xml文档获取
        //2.1获取student.xml的path
        String path = TestJsoup.class.getClassLoader().getResource("com/sunny/xml/stu.xml").getPath();
        //2.2解析xml文档,加载文档进内存,获取dom树--->Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.获取name元素对象 Element
        Elements elements = document.getElementsByTag("name");

        //3.1获取第一个name的Element对象
        Element element = elements.get(1);
        //3.2获取数据
        String name = element.text();
        System.out.println(name);
    }

    // 通过解析一个html来获取document对象
    public static void parseString() throws Exception{
        String str = "<students>\n" +
                "    <student number=\"101\">\n" +
                "        <name>Tom</name>\n" +
                "        <age>18</age>\n" +
                "        <sex>male</sex>\n" +
                "    </student>\n" +
                "    <student number=\"102\">\n" +
                "        <name>Lucy</name>\n" +
                "        <age>16</age>\n" +
                "        <sex>female</sex>\n" +
                "    </student>\n" +
                "</students>";
        Document document = Jsoup.parse(str);
        System.out.println(document);
    }

    // 通过网络路径来解析指定的html/xml的document对象
    public static void parseURL() throws  Exception{
        Document document = Jsoup.parse(new URL("https://www.baidu.com"), 5000);
        System.out.println(document);
    }

    // 获取Element的常用方法
    public static void getElements() throws Exception{
        String path = TestJsoup.class.getClassLoader().getResource("com/sunny/xml/stu.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 获取属性名为id的所有元素
        Element element = document.getElementsByAttribute("id").get(1);
        System.out.println(element);
        System.out.println("------------");
        Elements element1 = document.getElementsByAttributeValue("number", "101");
        System.out.println(element1);
        System.out.println("-------------");
        // 通过name标签名获取所有的name标签,通过get(0)获取第一个name标签,通过name标签的attr("id")属性名来获取id属性的属性值
        String attr = document.getElementsByTag("name").get(0).attr("id");
        System.out.println(attr);
    }
}
快捷查询方式

跳转到目录

selector 选择器
    // 使用选择器selector来快速查询需要的元素
    public static void getSelector() throws Exception{
        String path = TestJsoup.class.getClassLoader().getResource("com/sunny/xml/stu.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 根据标签名选择器来获取name元素
        Elements names = document.select("name");
        System.out.println(names);
        System.out.println("--------------------");
        // 根据id选择器来获取
        Elements eles = document.select("#888");
        System.out.println(eles);
        System.out.println("--------------------");
        // 根据类选择器来获取
        Elements eles2 = document.select(".zy");
        System.out.println(eles2);
        System.out.println("--------------------");
        // 根据属性选择器来查询
        Elements eles3 = document.select("student[number=\"102\"]");
        System.out.println(eles3);
        System.out.println("--------------------");
        // 根据后代选择器来查询
        Elements eles4 = document.select("student > age");
        System.out.println(eles4);
    }
XPath

跳转到目录
注: 这里说的XPath为Jsoup中的XPath操作, 不同的解析器也可能支持XPath, XPath语法相同, 但是不同的解析器如何来操作XPath的语法可能不同!

  • 导包(前面提供的网盘链接)
  • 通过JXDocument对象调用selN("XPath语法")来操作.
    • 通过JXDocument jxDocument = new JXDocument(document);来创建JXDocument对象.
    // 使用Jsoup的XPath来操作DOM树
    public static void getXPath() throws Exception {
        String path = TestJsoup.class.getClassLoader().getResource("com/sunny/xml/stu.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 根据Document创建JXDocument对象
        JXDocument jxDocument = new JXDocument(document);
        // 结合XPath语法查询
        List<JXNode> jxNodes = jxDocument.selN("//name");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }
        System.out.println("-------------------------");
        // 查询所有student标签下的name标签
        List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes1) {
            System.out.println(jxNode);
        }
        System.out.println("-------------------------");
        // 查询student标签下带有class属性的sex标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student/sex[@class]");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }
        System.out.println("-------------------------");
        // 查询student标签下带有class属性的sex标签,并且class属性值为gzy
        List<JXNode> jxNodes3 = jxDocument.selN("//student/sex[@class='gzy']");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值