xml解析方式

解析:操作xml文档,将文档中的数据读取到内存中

  • 操作xml文档:

    • 解析(读取):将文档中的数据读取到内存中
    • 写入:将内存中的数据保存到xml文档中,持久化的存储
  • 解析xml的方式:

    • DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
      • 优点:操作方便,可以对文档进行CRUD的所有操作
      • 缺点:占内存
    • SAX:逐行读取,基于事件驱动的。
      • 优点:不占内存。
      • 缺点:只能读取,不能增删改
  • xml常见的解析器:

    • JAXP:sun公司提供的解析器,支持dom和sax两种思想
    • DOM4J:一款非常优秀的解析器
    • Jsoup:jsoup是一款Java的HTML解析器,可以直接解析某个URL地址、HTML文本内容。它提供了一些非常胜利的API,可以通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
    • Pull:Android从阿祖哦系统内置的解析器,sax方式的
  • Jsoup:jsoup是一款Java的HTML解析器,可以直接解析某个URL地址、HTML文本内容。它提供了一些非常胜利的API,可以通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。

    • 快速入门:
      • 步骤:
        • 导入jar包
        • 获取Document对象
        • 获取对应的标签Element对象
        • 获取数据
package com.ailyt.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 JsoupStudy1 {
    public static void main(String[] args) throws IOException {
        //获取Document对象,根据xml文档获取
        String path = "src//main//resources//student.xml";
        //解析xml文档,加载文档进内存,获取dom树--->Document
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //获取元素对象 Element
        Elements elements = document.getElementsByTag("name");

        System.out.println(elements.size());

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

  • 对象的使用:
    • 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.ailyt.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;
import java.net.URL;


public class JsoupStudy2 {
    public static void main(String[] args) throws IOException {
/*        String str = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
                "\n" +
                "<students>\n" +
                "    <student number=\"lala_0001\">\n" +
                "        <name>zhangsan</name>\n" +
                "        <age>100</age>\n" +
                "        <sex>female</sex>\n" +
                "    </student>\n" +
                "\n" +
                "    <student number=\"lala_0002\">\n" +
                "        <name>李四</name>\n" +
                "        <age>50</age>\n" +
                "        <sex>male</sex>\n" +
                "    </student>\n" +
                "\n" +
                "</students>";

        Document document = Jsoup.parse(str);
        System.out.println(document);*/

//        parse(URL url,int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
        URL url = new URL("https://www.bilibili.com/video/BV1wL411L7A3?p=11");//代表网络中的一个资源路径
        Document document = Jsoup.parse(url, 10000);
        System.out.println(document);

    }
}

  • Document:文档对象。代表内存中的demo树
    • 获取Element对象
      • getElementById(String id):根据id属性获取唯一的element对象
      • getElementByTag(String tagName):根据标签名获取元素对象集合
      • getElementsByAttribute(String key):根据属性名称获取元素对象集合
      • getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合
package com.ailyt.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;
import java.net.URL;


public class JsoupStudy3 {
    public static void main(String[] args) throws IOException {
        String path = "src/main/resources/student.xml";

        //获取Document对象
        Document document = Jsoup.parse(new File(path), "UTF-8");

        //获取元素了
        //获取所有document对象
        Elements elements = document.getElementsByTag("student");
        System.out.println(elements);

        System.out.println("---------------");

        //获取属性名为di的元素对象们
        Elements id = document.getElementsByAttribute("id");
        System.out.println(id);


        //获取number属性值为heima_0001的元素对象
        Elements elementsByAttributeValue = document.getElementsByAttributeValue("number", "heima_0001");
        System.out.println(elementsByAttributeValue);

        //获取id属性值的元素对象
        Element itcast = document.getElementById("itcast");
        System.out.println(itcast);
    }
}

  • Elements:元素Element对象的集合。可以动作ArrayList来使用
  • Element:元素对象
    • 获取子元素对象

      • getElementById(String id):根据id属性获取唯一的element对象
      • getElementByTag(String tagName):根据标签名获取元素对象集合
      • getElementsByAttribute(String key):根据属性名称获取元素对象集合
      • getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合
    • 获取属性值

      • String attr(String key):根据属性名称获取属性值
    • 获取文本内容

      • String text():获取文本内容
      • String html():获取标签体的所有内容(包括标签的字符串内容)
package com.ailyt.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;


public class JsoupStudy4 {
    public static void main(String[] args) throws IOException {
        String path = "src/main/resources/student.xml";

        //获取Document对象
        Document document = Jsoup.parse(new File(path), "UTF-8");


        //通过Document对象获取name标签,获取所有的name标签,可以获取到两个
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.size());
        System.out.println("---------------------");
        //通过Element对象获取子标签对象
        Element element_student = document.getElementsByTag("student").get(0);
        Elements element_name = element_student.getElementsByTag("name");
        System.out.println(element_name);

        //通过student对象的属性值
        String number = element_student.attr("NUMBER");
        System.out.println(number);

        //获取文本内容
        String text = element_name.text();
        String html = element_name.html();
        System.out.println(text);
        System.out.println(html);
    }
}

  • Node:节点对象

    • Document和Element的父类
  • 快速查询方式:

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


public class JsoupStudy5 {
    public static void main(String[] args) throws IOException {
        String path = "src/main/resources/student.xml";

        //获取Document对象
        Document document = Jsoup.parse(new File(path), "UTF-8");


        //查询name标签
        /**
         * div{
         *
         * }
          */
        Elements elements = document.select("name");
        System.out.println(elements);
        System.out.println("--------------");
        //查询id值为itcast的元素
        Elements elements1 = document.select("#itcast");
        System.out.println(elements1);

        //获取student标签并且number属性值为heima_0001的age子标签
        //获取student标签并且number属性值为heima_0001
        Elements elements2 = document.select("student[number=\"heima_0001\"]");
        System.out.println(elements2);
    }
}

  • XPath:XPath即为XML路径语言,它是一种用来确认XML(标准通用标记语言的子集)文档中某部分位置的语言
    • 使用Jsoup的Xpath需要额外导入jar包。
package com.ailyt.xml.jsoup;

import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class JsoupStudy6 {
    public static void main(String[] args) throws IOException {
        String path = "src/main/resources/student.xml";
        //获取Document对象
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //根据document对象,创建JXDocument对象
        JXDocument jxDocument = new JXDocument(document);
        //结合xpath语法查询
        List<JXNode> jxNodes = jxDocument.selN("//student");
        jxNodes.forEach(jxNode -> {
            System.out.println(jxNode);
        });

        System.out.println("-----------------------------------------------------------");
        //查询所有的student标签下的name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
        jxNodes2.forEach(jxNode -> {
            System.out.println(jxNode);
        });
    }
}

posted @ 2022-08-07 17:44  我滴妈老弟  阅读(91)  评论(0编辑  收藏  举报