1. 程式人生 > 其它 >XML的簡單認識

XML的簡單認識

一、初識XML

1.1 XML和HTML的對比

1.1.1 用途方面

XML主要用於資料儲存、傳輸、配置檔案;HTML主要用於頁面展示。
(一開始XML想替換HTML,後來失敗了就轉資料儲存應用了。)

1.1.2 標籤擴充套件性方面

Extensible Markup Language:可擴充套件標記語言

  • XML可擴充套件:標籤不用提前定義,可以自行定義,只要符合規範即可
  • HTML不可擴充套件:標籤都是定義好的

1.2 HTML和XML的關係?

HTML和XML都是w3c公司的產品。

  • w3c:全球資訊網聯盟,制定各種網路標準,比如js、html、css都是他們制定的。
  • html先出現在市場,但是各個廠商版本的瀏覽器為了展示自己功能的強大,有些就不遵循html的標準,當然也能實現頁面的正常展示。例子如下:
<html>
	<head></head>
	<body>
		<font color="red">這是font</font>
	</body>
</html>
<font color="red">這是font</font>

上述二者皆可正常展示。
XML語法非常嚴格,必須遵循規範,否則解析不出來。結果發現沒人用,因為習慣用HTML,二者語法功能也一樣,相比XML語法更嚴格,所以就沒人用。XML退出幕後,常用於資料儲存,在java中用作配置檔案也比較多。
Java中properties 配置檔案舉例:
.properties(扁平)
姓名:張三
年齡:18
性別:男
Xml配置檔案有層次,所以用作配置檔案很合適
<人>
<姓名>張三</姓名>
……
</人>

二、XML的作用

2.1 儲存(資料庫)

<students>
	<student>
		<name>as</name>
		<age>12</age>
	</student>
	<student>
		<name>as</name>
		<age>12</age>
	</student>
	<student>
		<name>as</name>
		<age>12</age>
	</student>
</students>

利用XML解析工具可以對上面的檔案進行增刪改查的操作

2.2 資料傳輸

XML可以作為兩個系統之間傳輸資訊的載體
一個由C語言寫的系統,一個由Java語言寫的系統,二者之間進行資料交流需要雙方都認可的資料格式才行,這種需要提前約定好XML格式。不同系統之間怎麼約定XML的資料格式?可以用xml的約束來規定,約束需要提前約定,具體約束方式後面會有。

2.3 配置檔案

所有的應用幾乎都有配置檔案,配置檔案是用來定義應用的一些屬性資訊的。例如qq、微信,應用的開啟介面和尺寸都是提前規定好的,可以把這些資訊寫在程式中(把程式寫死了,程式和配置耦合到一起了),也可以把這些配置資訊寫在配置檔案中,在啟動程式的時候讀取這些配置檔案即可(程式和配置分開了,程式變得更靈活)。

<config>
	<color>red</color>
</config>

三、xml檔案的書寫要求

1、 xml的檔案字尾是.xml

2、 xml的第一行必須定義為文件宣告

3、 xml文件中有且僅有一個根標籤

4、 屬性值必須使用引號(單雙都行)引起來

5、 標籤必須正確關閉

6、 xml的標籤名稱區分大小寫

<?xml version="1.0"?>
<students>
	<student>
		<name>as</name>
		<age>18</age>
		<gender value="female"/>
		<sex>female</sex>
	</student>
</students>

四、xml的組成部分

4.1 文件宣告

格式:
屬性列表:
version:版本號,必須的屬性,只有兩個1.0或者1.1,1.1版本不相容1.0的,所以用的很少。
encoding:預設是iso-8859-1,告訴瀏覽器以這個編碼去解析,但是這個編碼不包含中文。注意:這個地方的值要和儲存檔案的時候的編碼值保持一致。
Standalone:是否獨立。值:yes或no,就是說當前檔案是否需要依賴外部檔案。經過實踐發現,無論什麼值,都可依賴外部檔案,寫不寫都沒用。

4.2 指令

控制xml去做什麼事情,(瞭解,用的很少)
例如:指揮瀏覽器怎麼解析當前xml檔案:

新增樣式,實際上用的很少。

當前路徑提前建立sytle.css樣式檔案
name{
color:red;
}

4.3 標籤

標籤名稱自定義
規則:

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

4.4 屬性

id屬性值唯一,id是唯一標識值

4.5文字

CDATA區:在該區域中的資料會被原樣展示
	格式:  <![CDATA[ 資料 ]]>
		 <![CDATA[內容]]>

五、Xml的DTD約束和Schema約束

5.1 什麼是約束

規定xml文件的書寫規則。

5.2 為什麼xml需要約束

舉例:A系統用c語言寫的,B系統用java語言寫的,系統之間進行資料交流,就可以用xml進行交流,但是不能隨意定義標籤,需要提前規定xml的資料樣式和資料規則,標籤代表什麼含義等。

<content>
	<message>你好</message>
	<data>today</data>
</content>

5.3 約束的種類

  • DTD:一種簡單的約束技術(Document Type Definition),比較簡單。
  • Schema(大綱):一種複雜的約束技術。
    約束在開發中的應用場景:
    框架(booststrap)(半成品的軟體/專案)+需要很多的配置(xml檔案)+由開發者進行配置,配置檔案不能亂配置,要按照框架給出的約束去配置。

5.3.1 XML的DTD約束

DTD的三種引入方式:

  • 內部dtd:將約束規則定義在xml文件中
  • 本地dtd:
  • 網路dtd:

方式一:內部dtd

方式二:本地dtd

方式三:網路dtd

5.3.2 XML的schema約束

Schema約束檔案的字尾名是xsd,本質上還是個xml檔案。

XSD內部檔案的格式:

XML約束檔案的引用格式:

六、XML檔案的解析

6.1 什麼叫xml的解析

指的就是操作XML文件,將文件中的資料讀取到記憶體中,或者是把記憶體中的資料寫到xml檔案中去。

  • 解析(讀取):將文件中的資料讀取到記憶體中
  • 將記憶體中的資料儲存到xml文件中,持久化的儲存

6.2 解析xml的兩種思想

6.2.1 DOM(Document Object Model)

將標記語言文件一次性載入進記憶體,在記憶體中形成一顆dom樹。

  • 優點:操作方便,可以對文件進行CURD的所有操作
  • 缺點:佔記憶體

6.2.2 SAM(Simple API for XML)

SAM:逐行讀取,基於事件驅動的。
逐行讀取(逐個元素讀取):讀到下一行的內容的時候,把上一行的內容丟掉,在記憶體中永遠只有一行資料。
事件驅動:讀到根標籤要作什麼,讀到屬性節點要做什麼,讀到文字標籤要做什麼,讀到結束標籤要做什麼,程式碼要自己寫,所以比較複雜。

  • 優點:不佔記憶體
  • 缺點:只能讀取,不能增刪改

6.3 Xml常見的解析器

  • JAXP:sun公司提供的解析器,支援dom和sam兩種思想。不需要匯入第三方jar包,因為JAXP就是sun公司的產品,已經在jdk中了。但是沒人用,因為效率低。
  • DOM4J:一款非常優秀的解析器(dom+sam),市面上用的也比較多。
  • Jsoup:簡單高效,jsoup是一款JAVA的HTML解析器,可直接解析某個URL地址,HTML文字內容。它提供了一套非常省力的API,可通過DOM,css以及類似jQuery的操作方法來取出和操作資料。
  • PULL:Android作業系統內建的解析器,sam方式的。手機記憶體小,所以就是sam方式,但是在伺服器端一般就採用dom解析方式。

參考:https://www.bilibili.com/video/BV11u411i7hM/?spm_id_from=333.999.0.0&vd_source=d6067928eb906629adf6cc260761df74