XML的学习
文章目錄
- XML 簡(jiǎn)介
- XML 語(yǔ)法
- XML 組成部分
- XML 約束
- DTD
- 名稱解釋
- 引用內(nèi)部的 DTD
- 引用外部的 DTD
- Schema
- 語(yǔ)法格式詳解
- 命名空間前綴的意義
- XML 解析
- 解析 XML 的方式(思想)
- 解析器
- JSOUP 的使用
- JSOUP 入門(mén)
- 快捷查詢
- Jsoup 選擇器查詢
- XPath
XML 簡(jiǎn)介
XML,Extensible Markup Language,可擴(kuò)展標(biāo)記語(yǔ)言。
可擴(kuò)展,主要是指標(biāo)簽完全由用戶自定義。
功能:存儲(chǔ)數(shù)據(jù)
1.配置文件
2.在網(wǎng)絡(luò)中傳輸
xml 與 html 的區(qū)別:
1.xml 標(biāo)簽都是自定義的,html 標(biāo)簽是預(yù)定義
2.xml 的語(yǔ)法嚴(yán)格,html 語(yǔ)法松散
3.xml 是存儲(chǔ)數(shù)據(jù)的,html 是展示數(shù)據(jù)
XML 語(yǔ)法
語(yǔ)法規(guī)則:
1.xml 文檔的后綴名.xml
2.xml 第一 行必須定義為文檔聲明
3.xml 文檔中有且僅有一個(gè)根標(biāo)簽
4.后性值必須使用引號(hào)(單雙都可)引起來(lái)
5.標(biāo)簽必須正確關(guān)閉
6.xml標(biāo)簽名稱區(qū)分大小寫(xiě)
XML 組成部分
1.文檔聲明
1.1.格式:<?xml 屬性列表 ?>
1.2.屬性列表:
version:版本號(hào),必須的屬性
encoding:指定解碼的字符編碼。告知解析引擎需要使用什么字符編碼解碼文檔,默認(rèn)值: ISO- 8859-1
standalone:是否獨(dú)立。取值 yes:不依賴其他文件;取值 no:依賴其他文件。這個(gè)了解即可。
2.指令
引入 css 文件,用于展示 xml 文件的內(nèi)容
<?xml-stylesheet type="text/css" href="demo.css" ?>
3.標(biāo)簽
自定義標(biāo)簽名稱,命名規(guī)則和 HTML 相同
4.屬性
id 屬性值必須唯一
5.文本
CDATA區(qū):在該區(qū)域中的數(shù)據(jù)會(huì)被原樣展示
格式:<![CDATA[ 數(shù)據(jù) ]]>
XML 約束
作為框架的使用者(程序員) :
1.能夠在 xml 中引入約束文檔
2.能夠簡(jiǎn)單的讀懂約束文檔
約束分類:
1.DTD:一種簡(jiǎn)單的約束技術(shù)
2.Schema:一種復(fù)雜的約束技術(shù)
DTD
引入 DTD 可以使用兩種方式,引用內(nèi)部定義的 DTD 和引用外部的 DTD 文檔。
內(nèi)部 DTD:將約束規(guī)則定義在 XML 文檔中
外部 DTD:將約束的規(guī)則定義在外部的 DTD 文件中
名稱解釋
#PCDATA:表示元素的內(nèi)容是普通文本
CDATA:表示屬性值的類型是字符串類型
#REQUIRED:表示屬性是必須的
ID:表示屬性值是唯一的
#IMPLIED:表示屬性非必須的,即可有可無(wú)
引用內(nèi)部的 DTD
下面的范例就是引用內(nèi)部的 DTD:
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/css" href="demo.css"?> <!DOCTYPE 書(shū)籍列表[<!-- 定義一個(gè)標(biāo)簽,名稱叫"書(shū)籍列表",里面包含標(biāo)簽"武俠小說(shuō)"和"computer_book",并且"武俠小說(shuō)"和"computer_book"可以出現(xiàn)任意個(gè)(≥0)--><!ELEMENT 書(shū)籍列表 (武俠小說(shuō)*,computer_book*)><!-- 定義一個(gè)標(biāo)簽,名稱叫武俠小說(shuō),里面包含標(biāo)簽書(shū)名、作者、價(jià)格、冊(cè)數(shù)、簡(jiǎn)介,要求出現(xiàn)的順序必須一致,而且每個(gè)標(biāo)簽只能有1個(gè),而且必須有--><!--作者+,表示作者標(biāo)簽可以有1個(gè)或者多個(gè)--><!--簡(jiǎn)介?,表示簡(jiǎn)介標(biāo)簽可以有0個(gè)或者1個(gè)--><!ELEMENT 武俠小說(shuō) (書(shū)名,作者+,價(jià)格,冊(cè)數(shù),簡(jiǎn)介?)><!ELEMENT computer_book (book_name,author,price,copies,profile)><!--(phone|mobile)*,表示可以出現(xiàn)phone或者mobile,或者兩者都出現(xiàn),可以出現(xiàn)多次--><!ELEMENT 作者 (name,(phone|mobile)*)><!ELEMENT name (#PCDATA)><!ELEMENT phone (#PCDATA)><!ELEMENT mobile (#PCDATA)><!ELEMENT 書(shū)名 (#PCDATA)><!ELEMENT 價(jià)格 (#PCDATA)><!ELEMENT 簡(jiǎn)介 (#PCDATA)><!ELEMENT 冊(cè)數(shù) (#PCDATA)><!ELEMENT book_name (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT price (#PCDATA)><!ELEMENT copies (#PCDATA)><!ELEMENT profile (#PCDATA)><!--表示武俠小說(shuō)標(biāo)簽有屬性isbn,且是必須的。REQUIREd表示必須,IMPLIED非必須,ID表示屬性值唯一;有屬性hot,默認(rèn)值false--><!ATTLIST 武俠小說(shuō)isbn CDATA ID #REQUIREddate CDATA #REQUIREdhot CDATA "false">]>引用外部的 DTD
DTD 可以獨(dú)立成文檔,在 XML 文檔中引入 DTD 文檔,引入語(yǔ)法格式:
如果 DTD 文件在項(xiàng)目中:<!DOCTYPE 根標(biāo)簽名 SYSTEM "DTD文件的路徑">
如果 DTD 文件在網(wǎng)絡(luò)中:<!DOCTYPE 根標(biāo)簽名 PUBLIC "DTD文件名稱" "DTD文件的URL">
DTD類型:
PUBLIC,行業(yè)共用的
SYSTEM,系統(tǒng)本地的,自定義的
Schema
語(yǔ)法格式詳解
xmlns:namespace-prefix="namespace",其中的 namespace-prefix 可以省略掉。namespace-prefix 叫做命名空間前綴,其實(shí)相當(dāng)于變量,用來(lái)引用某個(gè)命名空間。
xmlns 是 XML Namespace 的縮寫(xiě),譯為 XML 命名空間。命名空間可理解為某種資源的別名,用來(lái)區(qū)分、識(shí)別不同的引用資源。
xmlns:xsi 表示使用 xsi 來(lái)引用指定的命名空間,而這個(gè) xsi 在 XML 中叫做命名空間前綴。
xsi 是 XML Schema Instance,含義是 Schema 的實(shí)例,Schema 是一種約束技術(shù),所謂實(shí)例就是這種技術(shù)的具體實(shí)現(xiàn),所以 xsi 是用來(lái)引用 Schema 技術(shù)的具體實(shí)現(xiàn)的。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 表示使用 xsi 引用命名空間 http://www.w3.org/2001/XMLSchema-instance。
Schema 技術(shù)的具體實(shí)現(xiàn)有很多,如下圖所示:
xsi:schemaLocation 屬性定義了 XML Namespace 和 XSD(Xml Schema Definition)文檔的對(duì)應(yīng)關(guān)系。它的值由一個(gè)或多個(gè)URL引用對(duì)組成,命名空間與 XSD 文件之間,以空格和換行分隔。第一個(gè) URL 是 XSD 文件的 XML Namespace 的值,第二個(gè) URL 則是 Schema 文檔的位置,XML 引擎將從這個(gè)位置讀取 Schema 文檔,該文檔的 targetNamespace 必須與第一個(gè) URL 相匹配。
xsi:schemaLocation 屬性是來(lái)自于某個(gè)具體的 Schema 技術(shù)實(shí)現(xiàn),xsi 則引用某個(gè)命名空間,這個(gè)命名空間指向某個(gè)資源文件。
例如:
<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">xsi 引用 http://www.w3.org/2001/XMLSchema-instance,http://www.w3.org/2001/XMLSchema-instance 是一種 Schema 的具體技術(shù)實(shí)現(xiàn)。
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd",xsi:schemaLocation 屬性是來(lái)自于前綴 xsi 的,而前綴 xsi 引用 http://www.w3.org/2001/XMLSchema-instance,所以 schemaLocation 屬性其實(shí)是來(lái)自于 http://www.w3.org/2001/XMLSchema-instance,也就是說(shuō)在 http://www.w3.org/2001/XMLSchema-instance 中定義了屬性 schemaLocation。
schemaLocation 的值是 http://www.itcast.cn/xml student.xsd,說(shuō)明 XML 具體使用的 Schema 定義文檔時(shí)是 sutdent.xsd,而且這個(gè)文檔的命名空間是 http://www.itcast.cn/xml,那么就可以通過(guò) http://www.itcast.cn/xml 來(lái)引用文檔 sutdent.xsd。
xmlns="http://www.itcast.cn/xml",這個(gè)表示標(biāo)簽沒(méi)有前綴的情況下默認(rèn)引用的命名空間是 http://www.itcast.cn/xml,而這個(gè)命名空間指向的是 sutdent.xsd,所以標(biāo)簽沒(méi)有前綴的情況下默認(rèn)使用 sutdent.xsd 中的定義。
命名空間前綴的意義
<?xml version="1.0" encoding="UTF-8" ?> <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.itcast.cn/xml"xmlns:a="http://www.itcast.cn/xml2"xsi:schemaLocation="http://www.itcast.cn/xml student.xsdhttp://www.itcast.cn/xml2 student2.xsd"><student number="heima_0001"><name>劉德華</name><age>11</age><gender>male</gender></student> <!--這個(gè)student標(biāo)簽使用的是student2.xsd的定義--><a:student number="heima_0002"><a:name>張學(xué)友</a:name><a:age>11</a:age><a:gender>male</a:gender></a:student> </students>如上所示,xml 文檔中引入兩個(gè) Scheme 定義文件,而這兩個(gè)文件中都定義了標(biāo)簽 <student>、<name>、<age>、<gender>,那么你要使用哪個(gè) XSD 文檔定義的標(biāo)簽?zāi)?#xff1f;你可以在標(biāo)簽前面加上前綴進(jìn)行標(biāo)識(shí),這樣 XML 引擎就知道要依據(jù)哪個(gè) XSD 進(jìn)行解析判斷了。
XML 解析
操作 XML 文檔:
所謂解析,就是讀取數(shù)據(jù)(input/輸入),將 XML 文檔中的數(shù)據(jù)讀取到內(nèi)存中。
寫(xiě)入數(shù)據(jù)(output/輸出),就是將內(nèi)存中的數(shù)據(jù)保存到 XML 文檔中,即所謂的持久化存儲(chǔ)。
解析 XML 的方式(思想)
1.DOM
將標(biāo)記語(yǔ)言文檔一次性加載進(jìn)內(nèi)存中,在內(nèi)存中形成一棵 DOM 數(shù)。適用于服務(wù)器等設(shè)備
優(yōu)點(diǎn):操作非常方便,可以對(duì)文檔進(jìn)行 CRUD 的所有操作
缺點(diǎn):比較消耗內(nèi)存
2.SAX
逐行讀取,基于事件驅(qū)動(dòng),適用于內(nèi)存空間小設(shè)備,例如:手機(jī)
優(yōu)點(diǎn):不占內(nèi)存
缺點(diǎn):只能讀取,不能增刪改
解析器
根據(jù) DOM 或者 SAX 思想實(shí)現(xiàn)的工具包。
1.JAXP:sun 公司提供的解析器,支持 DOM 和 SAX 兩種思想,很少使用
2.DOM4J:優(yōu)秀的解析器,基于 DOM 思想實(shí)現(xiàn),在服務(wù)器端常用
3.jsoup:一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過(guò)DOM,CSS以及類似于jQuery的操作方法來(lái)取出和操作數(shù)據(jù)。
4.PULL:安卓系統(tǒng)內(nèi)置的解析器,基于 SAX 思想實(shí)現(xiàn)
JSOUP 的使用
步驟:
1.導(dǎo)入 jar 包
2.獲取 Document 對(duì)象,這個(gè)對(duì)象代表整個(gè) DOM 樹(shù)結(jié)構(gòu)
3. 獲取對(duì)應(yīng)的標(biāo)簽(即 Element 對(duì)象)
4. 獲取數(shù)據(jù)
JSOUP 入門(mén)
package pri.lwx.javaex.xmlex.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快速入門(mén)** @author liaowenxiong* @date 2021/12/14 11:53*/public class JsoupDemo01 {public static void main(String[] args) throws IOException {// 獲取XML文件的PathString path = JsoupDemo01.class.getClassLoader().getResource("pri/lwx/javaex/xmlex/schema/student.xml").getPath();// 解析XML文檔,加載文檔進(jìn)內(nèi)存,獲取dom樹(shù)(Document對(duì)象)// parse方法需要指定解碼的編碼格式Document doc = Jsoup.parse(new File(path), "utf-8");// 獲取元素對(duì)象// getElementsByTag通過(guò)標(biāo)簽名獲取元素對(duì)象集合// Elements繼承自ArrayListElements elements = doc.getElementsByTag("name");// 查看集合的長(zhǎng)度System.out.println("元素集合長(zhǎng)度:" + elements.size());// 獲取集合的第一個(gè)元素對(duì)象Element element = elements.get(0);// 獲取集合對(duì)象中的文本數(shù)據(jù)String name = element.text();System.out.println(name);} }對(duì)象的說(shuō)明:
1.Jsoup
工具類,可以解析 html 或者 xml 文檔,返回 Document 對(duì)象
parse(File in, String charsetName):解析 XML 和 HTML 文件
parse(String html):解析 HTML 和 XML 字符串
parse(URL url, int timeoutMillis):通過(guò)指定的網(wǎng)絡(luò)資源路徑獲取對(duì)應(yīng)的文檔對(duì)象
2.Document
文檔對(duì)象,代表內(nèi)存中的dom樹(shù)
Document 繼承自 Element
通過(guò) Document 對(duì)象獲取 Element 對(duì)象或者 Element 對(duì)象集合
getElementsByTag(string tagName) :根據(jù)標(biāo)金名稱獲取元素對(duì)家集合
getElementsByAttribute(String key) :根據(jù)屬性名稱獲取元素對(duì)象集合
getElementsByAttributevalue(String key, String value) :根據(jù)屬性名和屬性值獲取元素對(duì)象集合
getElementsByClass(String classValue):根據(jù) class 屬性值獲取元素對(duì)象集合
getElementById(String id):根據(jù)ID值獲取元素對(duì)象
3.Elements
Element 對(duì)象的集合,本質(zhì)是 ArrayList<Element>
4.Element
元素對(duì)象
4.1.可以獲取子元素對(duì)象
4.2.可以獲取元素的屬性值
public String attr(String attributeKey):根據(jù)屬性名獲取對(duì)應(yīng)的屬性值
4.3.可以獲取元素的文本內(nèi)容
public String text():獲取元素的文本內(nèi)容,包含子元素中的文本內(nèi)容
public String html():獲取元素的innerHTML內(nèi)容,即標(biāo)簽體中所有的內(nèi)容
5.Node
節(jié)點(diǎn)對(duì)象,Node 是 Element 的父類
快捷查詢
Jsoup 選擇器查詢
public Elements select(String cssQuery)
參考 Selector 類中定義的語(yǔ)法
示例代碼:
package pri.lwx.javaex.xmlex.jsoup;import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements;import java.io.File; import java.io.IOException;/*** Jsoup的選擇器查詢** @author liaowenxiong* @date 2021/12/15 10:19*/public class JsoupDemo04 {public static void main(String[] args) throws IOException {// 獲取xml文件的絕對(duì)路徑String path = JsoupDemo04.class.getClassLoader().getResource("pri/lwx/javaex/xmlex/schema/student.xml").getPath();// 獲取xml文件對(duì)應(yīng)的Document對(duì)象Document document = Jsoup.parse(new File(path), "utf-8");// 使用標(biāo)簽選擇器(類似css的標(biāo)簽選擇器)獲取所有名稱為student的元素Elements elements = document.select("student");System.out.println(elements);System.out.println("-----------------");// 使用屬性值選擇器獲取所有number屬性值為heima_0001的student元素Elements elements1 = document.select("student[number='heima_0001']");System.out.println(elements1);System.out.println("-----------------");// 使用屬性值選擇器+后代選擇器,獲取所有number屬性值為heima_0001的student元素所包含的name元素Elements elements2 = document.select("student[number='heima_0001'] name");System.out.println(elements2);System.out.println("-----------------");} }XPath
XPath即為XML路徑語(yǔ)言(XML Path Language),它是一種用來(lái)確定XML文檔中某部分位置的語(yǔ)言。
XPath 使用路徑表達(dá)式來(lái)選取 XML 文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集。節(jié)點(diǎn)是通過(guò)沿著路徑 (path) 或者步 (steps) 來(lái)選取的。
使用 XPath 需要導(dǎo)入相關(guān)的 jar 包:
JsoupXpath-2.5.1.jar
slf4j-jdk14-1.6.1.jar
slf4j-api-1.7.32.jar
antlr4-runtime-4.7.2.jar
commons-lang3-3.12.0.jar
主頁(yè):https://github.com/zhegexiaohuozi/JsoupXpath
教程:https://www.w3school.com.cn/xpath/index.asp
總結(jié)
- 上一篇: ETC储蓄卡钱不够了能过吗?
- 下一篇: 零XML的Spring配置