Java Web 07 — XML(约束_DTD/Schema、解析器Jsoup)

一、概念

  1. 概念:Extensible Markup Language 可扩展标记语言
    • 可扩展:标签都是自定义的。如自定义<user>
  2. 功能
    • 存储数据
      1. 配置文件
      2. 在网络中传输
  3. 与HTML的区别
    1. XML标签都是自定义的,html标签是预定义的
    2. XML的语法严格,html语法松散
    3. XML是存储数据的,html是展示数据的

二、语法结构

2.1 基本语法

  1. xml文档的后缀 .xml
  2. xml第一行必须定义为文档声明
  3. xml文档中有且仅有一个根标签
  4. 属性值必须使用引号(单双都可以)引起来
  5. 标签必须正确关闭
  6. xml标签名称区分大小写

2.2 快速入门

<?xml version='1.0' encoding='GBK' standalone='yes' ?>

<users>
	<user id='1'>
		<name>zhangsan</name>
		<age>23</age>
		<gender>male</gender>
		<br/>
	</user>
	
	<user id='2'>
		<name>lisi</name>
		<age>24</age>
		<gender>female</gender>
	</user>
	
	
</users>

2.3 组成部分

  1. 文档声明
    1. 格式:<?xml 属性列表 ?>
    2. 属性列表:
      1. version:版本号,必须的属性
      2. encoding:编码方式。告知解析引擎当前文档使用的字符集,默认:ISO8859-1
      3. standalone:是否独立
        • yes:不依赖其他文件
        • no:依赖其他文件
  2. 指令(了解):结合CSS
    • <?xml-stylesheet type="text/css" href="a.css" ?>
  3. 标签:标签名称自定义的
    • 规则:
      1. 名称可以包含字母、数字以及其他的字符
      2. 名称不能以数字或者标点符号开始
      3. 名称不能以字母xml(或者xml\Xml等等)开始
      4. 名称不能包含空格
  4. 属性
    1. id属性值唯一,与标签内容形成键值对
  5. 文本
    1. CDATA区:在该区域中的数据会被原样展示
      • <![CDATA[ if(a < b && a > c){};(你的数据) ]]>

2.4 约束

在这里插入图片描述

  1. 约束:规定xml文档的书写规则
    • 作为框架的使用者(程序员)
      1. 能够在xml中引入约束文档
      2. 能够简单的读懂约束文档

2.4.1 DTD(简单)

  1. 引入DTD文档到xml文档中

    • 内部dtd:将约束规则定义在xml文档中

    • 外部dtd:将约束的规则定义在外部的dtd文件中

      • 本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">

        <?xml version="1.0" encoding="UTF-8" ?>
        <--! 第一种声明方式 -->
        <!DOCTYPE students SYSTEM "student.dtd">
        
        <--! 第二种声明方式,不常用 -->
        <--! #PCDATA是文本 -->
        <!DOCTYPE students [
        		<!ELEMENT students (student*) >
        		<!ELEMENT student (name,age,sex)>
        		<!ELEMENT name (#PCDATA)>  
        		<!ELEMENT age (#PCDATA)>
        		<!ELEMENT sex (#PCDATA)>
        		<!ATTLIST student number ID #REQUIRED>
        		]>
        
        <students>
        	<student number="hdu001">
        		<name>ruki</name>
        		<age>18</age>
        		<sex>male</sex>
        	</student>
        	
        </students>
        
      • 网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件的名字" "dtd文件的位置">

2.4.2 Schema(复杂)(会看即可)

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 
	1.填写xml文档的根元素
	2.引入xsi前缀.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	3.引入xsd文件命名空间.  xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
	4.为每一个xsd约束声明一个前缀,作为标识  xmlns="http://www.itcast.cn/xml" 
	
	
 -->
 <students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 			 xmlns="http://www.itcast.cn/xml" 
 		   xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
 		    >
 	<student number="heima_0001">
 		<name>tom</name>
 		<age>18</age>
 		<sex>male</sex>
 	</student>		 
 </students>

三、解析

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

3.1 解析xml的方式

  1. DOM:将标记语言文档**一次性**加载进内存,在内存中形成一棵dom数
    1. 优点:操作方便,可以对文档进行CRUD的所有操作
    2. 缺点:占内存
  2. SAX:逐行读取,基于事件驱动的
    1. 优点:不占内存
    2. 缺点:只能读取,不能RUD

3.2 xml常见的解析器

  1. JAXP:sun公司提供的解析器,支持DOM和SAX两种思想。
  2. DOM4J:一款非常优秀的解析器
  3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
  4. PULL:android操作系统内置的解析器,SAX方式。

3.3 jsoup快速入门

3.3.1 步骤

  1. 导入jar包
  2. 获取docunment对象
  3. 获取对应的标签Element对象
  4. 获取数据
package day07_XML;

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 JsoupDemo01 {
    public static void main(String[] args) throws IOException {
        //2. 获取document对象,根据xml文档来获取
        //2.1 获取student.xml的path
        String path = JsoupDemo01.class.getClassLoader().getResource("student.xml").getFile();
        //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 获取数据 text()
        String name = element.text();
        System.out.println(name);

    }
}

3.3.2 jsoup对象的使用

  1. Jsoup:工具类,可以解析html或xml文档,返回Document对象

    1. parse():解析html或xml文档,返回Document
      1. parse(File in, String charsetName):解析xml或html文件的。
      2. parse(String html):解析xml或html字符串的。
      3. parse(URL url, int timeoutMillis):通过网络路径来获取指定的html和xml文档对象的。
  2. Document:文档对象。代表内存中的DOM树

    1. 获取Element对象

      1. getElementById(String id):根据id称获取唯一的element对象
      2. getElementByTag(String tagName):根据标签名称获取元素对象集合
      3. getElementByAttribute(String key):根据属性名称获取元素对象集合
      4. getElementByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素的对象集合
      package day07_XML;
      
      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 JsoupDemo03 {
          public static void main(String[] args) throws IOException {
              //获取document对象,根据xml文档来获取
              //1 获取student.xml的path
              String path = JsoupDemo03.class.getClassLoader().getResource("student.xml").getFile();
      
              //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 elements1 = document.getElementsByAttribute("id");
              System.out.println(elements1);
      
      
              System.out.println("------------");
      
              //3.3 获取number属性值为itcast_0001的元素对象
              Elements elements2 = document.getElementsByAttributeValue("number", "itcast_0001");
              System.out.println(elements2);
      
              //3.4 获取id属性值的元素对象
              System.out.println("------------");
              Element ruki = document.getElementById("ruki");
              System.out.println(ruki);
          }
      }
      
  3. Elements:元素Element对象的集合。可以当做ArrayList<Element>来使用

  4. Element:元素对象

    1. 获取子元素对象
      1. getElementById(String id):根据id称获取唯一的element对象
      2. getElementByTag(String tagName):根据标签名称获取元素对象集合
      3. getElementByAttribute(String key):根据属性名称获取元素对象集合
      4. getElementByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素的对象集合
    2. 获取属性值
      1. public String attr(String attributKey):根据属性名称,获取属性值
    3. 获取文本
      1. public String text():获取所有子标签的纯文本内容
      2. public String html():获取标签体的所有内容(包括子标签的标签和文本内容)
  5. Node:节点对象

    1. DocumentElement的父类
package day07_XML;

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 JsoupDemo04 {
    public static void main(String[] args) throws IOException {
        //获取document对象,根据xml文档来获取
        //1 获取student.xml的path
        String path = JsoupDemo04.class.getClassLoader().getResource("student.xml").getFile();

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

      /*
        1. 获取属性值
           1. `public String attr(String attributKey)`:根据属性名称,获取属性值
        2. 获取文本
           1. `public String text()`:获取文本内容
           2. `public String html()`:获取标签体的所有内容(包括子标签的字符串内容)
      */
        //通过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_student_name = element_student.getElementsByTag("name");
        System.out.println(element_student_name);
        System.out.println("------------");
        //获取student对象的属性值
        String number = element_student.attr("number");
        System.out.println(number);
        System.out.println("------------");
        //获取文本内容
        String text = element_student_name.text();
        String html = element_student_name.html();
        System.out.println(text);
        System.out.println(html);

    }
}

3.3.3 快捷查询方式

  1. selector:选择器

    • Elements select(String cssQuery)

      • 语法:参考selector定义的语法
      package day07_XML;
      
      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 JsoupDemo05 {
          public static void main(String[] args) throws IOException {
              //获取document对象,根据xml文档来获取
              //1 获取student.xml的path
              String path = JsoupDemo05.class.getClassLoader().getResource("student.xml").getFile();
      
              //2. 获取document对象
              Document document = Jsoup.parse(new File(path), "utf-8");
      
              //3. 查询name标签
      
              Elements elements = document.select("name");
              System.out.println(elements);
              System.out.println("--------");
              //4. 查询id值为ruki的元素
              Elements elements1 = document.select("#ruki");
              System.out.println(elements1);
              System.out.println("--------");
      
              //5.1 获取student标签并且属性值为itcast_0001
              Elements elements2 = document.select("student[number='itcast_0001']");
              System.out.println(elements2);
      
              //5.2 获取student标签,并且number属性值为itcast_0001的age子标签
              System.out.println("--------");
              Elements elements3 = document.select("student[number='itcast_0001'] > age");
              System.out.println(elements3);
      
      
      
      //        System.out.println("--------");
      
          }
      }
      
      
  2. Xpath:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

    • 使用Jsoup的Xpath需要额外导入一个jar包
    • 查询w3cschool参考手册,使用xpath的语法完成查询
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值