JavaWeb基础之XML解析&Jsoup

  • 时间:
  • 来源:互联网
  • 文章标签:

XML解析

其实就是操作xml文档,将文档中的数据读取到内存中来

  1. 解析(读取)
  2. 写入(将内存中的数据保存到xml文档中。持久化的存储)

解析xml的方式

1.DOM思想:将标记语言文档一次性加载进内存,在内存中形成一棵dom树,操作方便,可以对其进行CRUD的所有操作,弊端占内存大
2.SAX思想:逐行读取,读取一行释放一行,基于事件驱动的。不占内存,适用于内存较小的设备,弊端只能读取,不能增删改
所以,一般在服务器端使用的是DOM思想;一般在移动端使用的是SAX思想。
在这里插入图片描述

XML常见的解析器

1.JAXP: sun公司提供的解析器,支持dom和sax两种思想,比较烂,性能比较低,一般都不使用,代码写起来麻烦
2. DOM4J: 一款非常优秀的解析器,在服务器端经常会采用DOM4J解析器
3. Jsoup: 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
4. PULL: Android操作系统内置的解析器,使用的是SAX思想。

Jsoup解析器的使用

步骤:

  1. 导入Jsoup的jar包
  2. 获取document文档对象
  3. 获取对应的标签Element对象
  4. 获取数据

代码实现:
配置文件student.xml

<?xml version="1.0" encoding="utf-8"?>
<students>
    <student id="001">
        <name>zhangsan</name>
        <age>23</age>
        <sex>nan</sex>
    </student>
    <student id="002">
        <name>lisi</name>
        <age>23</age>
        <sex>nan</sex>
    </student>
</students>

解析代码.java文件

package 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 JsoupDemo {
    public static void main(String[] args)throws IOException {
        //1.导入jar包
        //2.获取document对象,根据xml文档获取
        //2.1获取student.xml的path
        String path = JsoupDemo.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");
        //可以将Elements当做一个ArrayList集合来看待
        System.out.println(elements.size()); //2
        //3.1获取第一个name的Element对象
        Element element = elements.get(0);
        //3.1获取数据
        String name = element.text();
        System.out.println(name);
    }
}

详解解析过程中使用到的对象

1. 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文档对象

代码演示:最常用的一种获取Document对象

package jsoup.demo;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.IOException;

public class JsoupDemo2 {
    public static void main(String[] args)throws IOException {
        //获取student.xml的path
        String path = JsoupDemo.class.getClassLoader().getResource("student.xml").getPath();
       //获取Document对象 
       Document document = Jsoup.parse(new File(path),"utf-8");
       System.out.println(document);
    }
}

2. Documemt代表文档对象。代表内存中的dom树

Elememnts: 元素Element对象的集合,可以当做一个ArrayList来使用 主要是获取Element对象

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

代码演示:
配置文件student.xml

<?xml version="1.0" encoding="utf-8"?>
<students>
    <student>
        <name id="">zhangsan</name>
        <age>23</age>
        <sex>nan</sex>
    </student>
    <student>
        <name id="itcast">lisi</name>
        <age>22</age>
        <sex>nan</sex>
    </student>
</students>

解析代码.java文件

package jsoup.demo2;

import jsoup.demo.JsoupDemo;
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 JsoupDocumentDemo {
    public static void main(String[] args)throws IOException {
        //1.获取student.xml的path
        String path = JsoupDemo.class.getClassLoader().getResource("student.xml").getPath();
        //2.获取document对象
        Document document = Jsoup.parse(new File(path), "utf-8");

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

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

        //3.3获取id属性值为itcast的元素对象
        Elements element3 = document.getElementsByAttributeValue("id","itcast");
        System.out.println(element3);
        System.out.println("-------------------");

        //根据id的属性值来获取
        Element itcast = document.getElementById("itcast");
        System.out.println(itcast);
    }
}

3. Element: 代表具体的元素对象
获取子元素对象,依旧可以通过以下方法来获取

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

获取属性值

attr(String key): 根据属性名称获取属性值

获取文本内容

String text(): 获取所有子标签的纯文本内容
String html(): 获取标签体的所有内容(包括子标签的标签和文本内容)

配置文件student.xml

<?xml version="1.0" encoding="utf-8"?>
<students>
    <student>
        <name id="">
            <xing>zhang</xing>
            <ming>san</ming>
        </name>
        <age>23</age>
        <sex>nan</sex>
    </student>
    <student>
        <name id="itcast">lisi</name>
        <age>22</age>
        <sex>nan</sex>
    </student>
</students>

解析代码.java文件

package jsoup.demo2;

import jsoup.demo.JsoupDemo;
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 ElementDemo {
    public static void main(String[] args)throws IOException {
        //1.获取student.xml的path
        String path = JsoupDemo.class.getClassLoader().getResource("student.xml").getPath();
        //2.获取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 ele_name = element_student.getElementsByTag("name");
        System.out.println(ele_name.size());
        System.out.println("--------------");
        //获取student对象的属性值
        String id = element_student.attr("id");
        System.out.println(id);

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

    }
}

4. Node: 节点对象
是Document和Element的父类。

快捷的查询方式(开发中最常用)

需要的时候可以查询Jsoup的相关文档Selector类
1.selector: 选择器
使用的方法

Element select(String cssQuery): 
//需要参考Selector类中的语法

实例:

package jsoup.demo2;
import jsoup.demo.JsoupDemo;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class JsoupDemo5 {
    public static void main(String[] args)throws IOException {
        //1.获取student.xml的path
        String path = JsoupDemo.class.getClassLoader().getResource("student.xml").getPath();
        //2.获取document对象
        Document document = Jsoup.parse(new File(path), "utf-8");

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

        //需求:获取id属性值为002的student标签下的age标签
        //先获取id属性值为002的student标签
        Elements elements3 = document.select("student[id='002']");
        System.out.println(elements3);
        System.out.println("-------------------");
        //再获取student标签下的age标签
        Elements elements4 = document.select("student[id='002'] > age");
        System.out.println(elements4);
    }
}

2.Xpath
是XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。具体操作和Xpath语法可以在W3C文档查阅相关资料。
步骤:

  1. 使用Jsoup的Xpath需要导入额外的jar包。
  2. 查询w3c参考手册,使用xpath语法完成查询。
package jsoup.demo2;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import jsoup.demo.JsoupDemo;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.util.List;
public class JsoupXpathDemo {
    public static void main(String[] args)throws Exception {
        //1.获取student.xml的path
        String path = JsoupDemo.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> jxNodes2 = jxDocument.selN("//student/name");
        for(JXNode jxNode : jxNodes2){
            System.out.println(jxNode);
        }
        System.out.println("-----------------");

        //4.3查询具有id属性的name标签
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
        for(JXNode jxNode : jxNodes3){
            System.out.println(jxNode);
        }
        //4.4查询具有id属性的name标签,并且属性值=itcast
        List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
        for(JXNode jxNode : jxNodes4){
            System.out.println(jxNode);
        }
    }
}

本文链接http://www.taodudu.cc/news/show-82834.html