day45_XML

XML概述

什麼XML?

  • XML 指可擴展標記語言(EXtensible Markup Language)
  • XML 是一種標記語言,很類似 HTML
  • XML 的設計宗旨是傳輸數據,而非顯示數據
  • XML 標籤沒有被預定義。您需要自行定義標籤。
  • XML 被設計爲具有自我描述性。
  • XML 是 W3C 的推薦標準

用途

  • XML 應用於 web 開發的許多方面,常用於簡化數據的存儲(寫配置文件)和數據在網絡上傳輸。

xml與html的區別

  • xml標籤都是自定義的,html標籤是預定義。
  • xml的語法嚴格,html語法鬆散
  • xml是存儲數據的,html是展示數據

基本語法

  • xml文檔的後綴名 .xml
  • xml第一行必須定義爲文檔聲明
  • xml文檔中有且僅有一個根標籤
  • 屬性值必須使用引號(單雙都可)引起來
  • 標籤必須正確關閉
  • xml標籤名稱區分大小寫
  • HTML 會把多個連續的空格字符裁減(合併)爲一個而在 XML 中,文檔中的空格不會被刪節。

組成部分

1:文檔聲明,格式:<?xml 屬性列表 ?>

<!--它定義 XML 的版本 (1.0) 和所使用的編碼 (ISO-8859-1 = Latin-1/西歐字符集)。XML獨立存在-->
<?xml version="1.0" encoding="ISO-8859-1" standalone ="yes"?>

屬性列表:

  • version:版本號,必須的屬性
  • encoding:編碼方式。告知解析引擎當前文檔使用的字符集,默認值:ISO-8859-1
  • standalone:是否獨立 取值yes:不依賴其他文件 no:依賴其他文件

2. 指令(瞭解):結合css的,可以導入CSS文件,很少使用

<!--指令:引入外在的CSS文件-->
<?xml-stylesheet type="text/css" href="a.css" ?>

3. 標籤:標籤名稱自定義的XML 元素必須遵循以下命名規則:

  • 名稱可以含字母、數字以及其他的字符
  • 名稱不能以數字或者標點符號開始
  • 名稱不能以字符 “xml”(或者 XML、Xml)開始
  • 名稱不能包含空格

4. 屬性

  • XML 元素可以在開始標籤中包含屬性,類似 HTML。屬性 (Attribute) 提供關於元素的額外(附加)信息。這些 ID 索引可用於標識 XML 元素,它起作用的方式與 HTML 中 ID 屬性是一樣的。簡而言之:id屬性值必須是唯一的。

5:CDATA區:在該區域中的數據會被原樣展示。格式:  <![CDATA[ 數據 ]]>

XML約束

什麼是約束?

  • 約束:規定xml文檔的書寫規則

作爲框架的使用者(程序員):

  • 能夠在xml中引入約束文檔
  • 能夠簡單的讀懂約束文檔

XML分類:

  • DTD:一種簡單的約束技術
  • Schema:一種複雜的約束技術

DTD約束

我們要使用DTD約束的前提引入dtd文檔到xml文檔中
引入方式分類:

  • 內部dtd:將約束規則定義在xml文檔中
  • 外部dtd:將約束的規則定義在外部的dtd文件中 又分爲 。定義在本地:<!DOCTYPE 根標籤名 SYSTEM "dtd文件的位置">丶定義在網絡:<!DOCTYPE 根標籤名 PUBLIC "dtd文件名字" "dtd文件的位置URL">

dtd約束舉例:

引入外部的dtd約束(dtd文件在本地) 

<?xml version="1.0" encoding="utf-8" ?>

<!DOCTYPE students SYSTEM "student.dtd"><!--本地方式引入dtd約束-->
<students>
    <student number="s001">
        <name>張三</name>
        <age>18</age>
        <sex>男</sex>
    </student>
</students>

Schema約束

Schema約束解決了dtd約束一些缺點,比如說不能缺點元素內容的類型,他比dtd約束更加複雜,更加。Schema約束舉例

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified">
 <!-- 定義了元素的名字爲students和類型爲studentsType,這個是自定義類型-->
    <xsd:element name="students" type="studentsType"/>
    <xsd:complexType name="studentsType"><!--聲明這個studentsType類型的具體信息-->
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="heima_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema> 

引入Schema約束:

  1. 填寫xml文檔的根元素
  2. 引入xsi前綴.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. 引入xsd文件命名空間.  xsi:schemaLocation="http://www.wrg.cn/xml  student.xsd"
  4. 爲每一個xsd約束聲明一個前綴,作爲標識  xmlns="http://www.wrg.cn/xml" 

SchemaXML文件舉例

<?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.wrg.cn/xml  student.xsd"
	http://www.wrg.cn/xml 就是studen.xsd的名字即命名空間。
	4.爲每一個xsd約束聲明一個前綴,作爲標識  xmlns="http://www.wrg.cn/xml"
	 我們可以根據標籤加前綴來確定使用的是哪個命名空間下的標籤,不寫則使用默認的命名空間。
 -->
<students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xmlns="http://www.itcast.cn/xml"
			xsi:schemaLocation="http://www.wrg.cn/xml  student.xsd"
>
	<student number="heima_0001">
		<name>tom</name>
		<age>18</age>
		<sex>male</sex>
	</student>

</students>

XML解析

操作xml文檔,將文檔中的數據讀取到內存中

操作xml文檔

  • 解析(讀取):將文檔中的數據讀取到內存中
  • 寫入:將內存中的數據保存到xml文檔中。持久化的存儲

解析xml的方式(思想):

DOM:將標記語言文檔一次性加載進內存,在內存中形成一顆dom樹

  • 優點:操作方便,可以對文檔進行CRUD的所有操作
  • 缺點:佔內存

SAX:逐行讀取,基於事件驅動的。

  • 優點:不佔內存。
  • 缺點:只能讀取,不能增刪改

xml常見的解析器:

  • JAXP:sun公司提供的解析器,支持dom和sax兩種思想,基本沒有人使用
  • DOM4J:一款非常優秀的解析器,基於DOM思想。
  • Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。
  • PULL:Android操作系統內置的解析器,sax方式的。

Jsoup解析器:

快速入門

步驟:

  1. 導入jar包
  2. 獲取Document對象
  3. 獲取對應的標籤Element對象
  4. 獲取數據
package JsoupTest;

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 Jsoup01 {
    public static void main(String[] args) throws IOException {
        //使用xml文件的path,使用類加載器
        //2.1獲取student.xml的path
        String path = Jsoup01.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);
    }
}

對象的使用:

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:文檔對象。代表內存中的dom樹

功能,獲取Element對象,常用方法:

  • getElementById​(String id):根據id屬性值獲取唯一的element對象
  • getElementsByTag​(String tagName):根據標籤名稱獲取元素對象集合
  • getElementsByAttribute​(String key):根據屬性名稱獲取元素對象集合
  • getElementsByAttributeValue​(String key, String value):根據對應的屬性名和屬性值獲取元素對象集合

Elements:元素Element對象的集合。可以當做 ArrayList<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的父類

Jsoup快捷查詢方式:

selector:選擇器   

  • 使用的方法:Elements   select​(String cssQuery)
package cn.itcast.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 JsoupDemo5 {
    public static void main(String[] args) throws IOException {
        //1.獲取student.xml的path
        String path = JsoupDemo5.class.getClassLoader().getResource("student.xml").getPath();
        //2.獲取Document對象
        Document document = Jsoup.parse(new File(path), "utf-8");

        //3.查詢name標籤
        /*
            div{

            }
         */
        Elements elements = document.select("name");
        System.out.println(elements);
        System.out.println("=----------------");
        //4.查詢id值爲itcast的元素
        Elements elements1 = document.select("#itcast");
        System.out.println(elements1);
        System.out.println("----------------");
        //5.獲取student標籤並且number屬性值爲heima_0001的age子標籤
        //5.1.獲取student標籤並且number屬性值爲heima_0001
        Elements elements2 = document.select("student[number=\"heima_0001\"]");
        System.out.println(elements2);
        System.out.println("----------------");

        //5.2獲取student標籤並且number屬性值爲heima_0001的age子標籤
        Elements elements3 = document.select("student[number=\"heima_0001\"] > age");
        System.out.println(elements3);

    }

}

XPath:XPath即爲XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言

  • 使用Jsoup的Xpath需要額外導入jar包。
  • 查詢w3cshool參考手冊,使用xpath的語法完成查詢
package cn.itcast.xml.jsoup;


import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

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

/**
 *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> jxNodes2 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }

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

        //4.3查詢student標籤下帶有id屬性的name標籤
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
        System.out.println("--------------------");
        //4.4查詢student標籤下帶有id屬性的name標籤 並且id屬性值爲itcast

        List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
        for (JXNode jxNode : jxNodes4) {
            System.out.println(jxNode);
        }
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章