1.XML概述
1.1XML:XML一種數據存儲格式,這種數據存儲格式在存儲數據內容的同時,還能夠保存數據之間的關係
1.2XML保存數據的方法:XML利用標籤來保存數據的內容,利用標籤之間的嵌套關係來保存數據之間的關係。
1.3XML的應用場景:
1.3.1利用XML跨平臺的特性,用來在不同的操作系統不同的開發語言之間傳輸數據。如果說java是一門跨平臺的語言,那XML就是跨平臺的數據。
1.3.2利用XML可以保存具有關係的數據的特性,還常常被用來做爲配置文件使用。,
1.4XML文件:把XML格式的數據保存到文件中,這樣的文件通常起後綴名爲.XML,這樣的文件就叫做XML文件,XML文件是XML數據最常見的存在形式,但是,這不是XML的唯一存在形式(在內存中或在網絡中也可以存在),不要把XML狹隘的理解成XML文件。
1.5XML校驗:瀏覽器除了內置html解析引擎外還內置了XML解析器,利用瀏覽器打開XML格式的數據,就可以進行XML校驗。
2.XML語法
2.1文檔聲明:一個格式良好的XML必須包含也只能包含一個文檔聲明,並且文檔聲明必須出現在XML文檔第一行,其前不能有其他任何內容。
2.1.1最簡單的寫法:<?XML version="1.0" ?>其中的version代表當前XML所遵循的規範版本。
2.1.2使用encoding屬性指定文檔所使用的字符集編碼:<?XML version="1.0" encoding="gb2312" ?>
注意:encoding屬性指定的編碼集和XML真正使用的編碼應該一致,如果不一致就會有亂碼問題。
encoding屬性默認值爲老外喜歡的iso8859-1
2.1.3使用standalone屬性指定當前XML文檔是否是一個獨立文檔:<?XML version="1.0" standalone="no" ?>,standalone默認值爲yes表示是一個獨立文檔。
注意:很多的解析器會忽略這個屬性,但是學習知識要按標準去學,所以這個屬性也要掌握。
2.2元素
2.2.1元素分爲開始標籤和結束標籤,在開始標籤和結束標籤之間的文本稱爲標籤體,如果一個標籤即不含標籤體也不包含其他標籤,那這樣的標籤可以把開始標籤和結束標籤進行合併,這樣的標籤叫自閉標籤。
<a>xxxxx</a> <a/>
2.2.2一個元素也可以包含若干子元素,但是要注意所有的標籤都要進行合理嵌套。
2.2.3一個格式良好的XML文檔應該具有並且只能有一個跟標籤,其他標籤都應該是這個跟標籤的子孫標籤。
2.2.4元素的命名規範:
區分大小寫,例如,<P>和<p>是兩個不同的標記。
不能以數字或標點符號或"_"開頭。
不能以XML(或XML、或Xml 等)開頭。
不能包含空格。
名稱中間不能包含冒號(:)
2.3屬性
一個元素可以包含多個屬性,屬性的值要用單引號或雙引號括起來。如果屬性的之中包含雙引號,就要用單引號了。
屬性的命名規範,參照元素的命名規範。
2.4註釋
<!--這是一段註釋-->
注意:註釋不能出現在文檔聲明之前。實驗:把註釋寫到文檔聲明之前,用ie打開是沒問題,但是用chrome打開是報錯的。這就看出來了不同的解析器有不同的處理,我們學習的時候還是按標準去學。
註釋不能嵌套註釋
2.5CDATA區、轉義字符
都可以用來轉義特殊字符。
2.5.1CDATA區<![CDATA[這是要轉義的內容]]>
被CDATA區擴起來的內容,將會被瀏覽器當作文本來處理。
2.5.2轉義字符
& --> &
< --> <
> --> >
" --> "
' --> '
2.5.3CDATA區和轉義字符的區別
(1)CDATA區可以成段的進行轉義,而轉義字符一次只能轉義一個字符
(2)CDATA區轉義的字符可以保存數據本來的格式只是通知解析器按文本去處理。轉義字符改變了數據本身的內容,利用其他字符替代了轉義字符。請思考,如果要轉義的內容是一段js程序的話,如果用轉義字符合適不合適?
2.6處理指令:一段指令通知解析器以何種方式解析XML
<?XML-stylesheet type="text/css" href="1.css" ?>指定解析器使用1.css去渲染當前的XML數據
其實文檔聲明就是一個最常見的處理指令。
3.DTD技術
3.1DTD是一門XML約束技術,用來約束XML寫法。
3.2如何在XML中引入一個DTD
3.2.1外部引入:dtd約束文件存在在一個外部文件中,我們在XML中引入該約束。
(1)本地文件引入:該dtd文件存在在本地硬盤中
<!DOCTYPE 根元素的名稱 SYSTEM "文件所在的路徑">
(2)公共位置文件引入:dtd約束文件存在在一個公共網絡上,我們在XML引入該約束
<!DOCTYPE 根元素的名稱 PUBLIC "dtd名稱" "dtd所在的URL">
3.2.2在XML內部寫dtd約束
在文檔聲明下<!DOCTYPE 根元素名稱 [dtd約束的內容]>
3.3利用dtd約束XML中的元素
<!ELEMENT 元素名稱 元素約束>
3.3.1元素約束
(1)存放類型
ANY:當前聲明的元素可以包含任意子元素
EMPTY:當前聲明的元素不能包含任何元素
(2)存放內容:利用小括號括起來的元素的名稱,用來表示該元素中可以存放哪些內容
<!ELEMENT "元素名" (可以包含的元素的名稱)>
小括號中的內容,可以有多個子元素的名稱
如果用“,”分割這些子元素就表明這些子元素必須按指定的順序出現
如果用“|”分割這些內容就表明這些子元素只能出現其中之一
使用“+”來表明內容可以出現一次或多次
使用“*”來表明內容可以出現零次或多次
使用“?”來表明內容可以出現零次或一次
#PCDATA表明該元素可以包含標籤體
可以利用()進行組操作:
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
3.4利用dtd約束XML中的屬性
<!ATTLIST 元素名
屬性名 屬性類型 屬性約束
。。。。>
3.4.1屬性類型
(1)CDATA:表明該屬性的值是一個普通的文本值。
(2)ENUMERATED:表明該屬性的值只能取指定範圍內的其中之一
(3)ID:表明該屬性值在整個文檔中必須唯一,注意ID類型的屬性的值必須以字母下劃線開頭,並且不能以數字開頭,不能包含空白字符
3.4.2屬性約束
(1)#REQUIRED 來表明當前這個屬性是必須存在的屬性
(2)#IMPLIED 來表明當前這個屬性是可選的屬性
(3)#FIXED "固定值" 來表明當前這個屬性具有一個默認的值,可以不明確指定該屬性,解析器會幫你加上,如果你硬是指定了一個其他的值,會出錯。
(4)"默認值" 來表明當前屬性具有一個默認的值,如果給這個屬性指定一個值就用指定的值,如果不指定呢,就使用默認值。
3.5實體:可以理解爲對一段內容的引用,如果有一段內容到處在被使用,可以將其設計爲一個實體
3.5.1引用實體:用在XML中的實體
聲明實體:<!ENTITY 實體名稱 "實體內容">
引用引用實體:&實體名稱;
3.5.2參數實體:用在DTD文件中的實體
聲明實體:<!ENTITY % 實體名稱 "實體內容">
引用參數實體: %實體名稱;
一、xml語法
1.文檔聲明
用來聲明xml的基本屬性,用來指揮解析引擎如何去解析當前xml
通常一個xml都要包含並且只能包含一個文檔聲明
xml的文檔必須在整個xml的最前面,在文檔聲明之前不能有任何內容
<?xml version="1.0" ?>--version是必須存在的屬性,表明當前xml所遵循規範的版本,目前位置都寫1.0就可以了
<?xml version="1.0" encoding="utf-8" ?>--encoding用來只會解析引擎在解析xml時使用的編碼,一定要保證xml格式的數據在保存時使用的編碼和解析時使用的編碼必須一致,纔不會有亂碼問題
<?xml version="1.0" encoding="utf-8" standalone="yes" />--standalone屬性用來指明當前xml是否是一個獨立的xml,默認值是yes表明當前文檔不需要依賴於其他文檔,如果當前文檔依賴其他文檔而存在則需要將此值設置爲no
2.元素
一個xml標籤就是一個元素
一個標籤分爲開始標籤和結束標籤
在開始標籤和結束標籤之間可以包含文本內容,這樣的文本內容叫做標籤體
如果標籤的開始標籤和結束標籤之間不包含標籤和子標籤則可以將開始標籤和結束標籤進行合併,這樣的標籤就叫做自閉標籤
一個標籤中也可以包含任意多個子標籤,但是一定要注意標籤一定要合理嵌套
一個格式良好的xml要包含並且只能包含一個根標籤,其他的標籤都應該是這個標籤的子孫標籤
區分大小寫,例如,<P>和<p>是兩個不同的標記。
不能以數字或標點符號或"_"開頭。
不能以xml(或XML、或Xml 等)開頭。
不能包含空格
名稱中間不能包含冒號(:)。
3.屬性
一個標籤可以有多個屬性,每個屬性都有它自己的名稱和取值,例如:
<china capital="beijing"/>
屬性的名在定義時要遵循和xml元素相同的命名規則
屬性的值需要用單引號或雙引號括起來
4. 註釋
<!-- 註釋內容 -->
註釋可以出現在xml文檔的任意位置除了整個文檔的最前面.不能出現在文檔聲明之前
註釋不能嵌套註釋
5.CDATA區/轉義字符
<![CDATA[轉義的內容]]>:
當XML中一段內容不希望被解析器解析時可以使用CDATA區將其包住
當解析器遇到CDATA區時會將其內容當作文本對待,不會進行解析
語法:<![CDATA[ 內容 ]]>
轉義字符:
& --> &
< --> <
> --> >
" --> "
' --> '
6.處理指令
處理指令,簡稱PI (processing instruction)。處理指令用來指揮解析引擎如何解析XML文檔內容。
<?xml-stylesheet type="text/css" href="1.css"?>
二、dtd語法 --- 瞭解語法,看得懂dtd就可以
1.如何在xml中引入dtd
(1)外部引入
可以將dtd的約束內容寫在外置的dtd文件中,這個文件後綴必須爲.dtd而文件保存時必須用utf-8編碼保存.
再在xml文件中使用
<!DOCTYPE 根元素名稱 SYSTEM 文件的位置>
如果寫的是SYSTEM表明當前引入的dtd在當前文件系統中,後面制定的文件位置是當前硬盤中的位置
<!DOCTYPE 文檔根結點 PUBLIC "DTD名稱" "DTD文件的URL">
如果寫的是PUBLIC表明當前引入的dtd在網絡公共位置中,後面要指明dtd的名字和dtd所在網絡位置URL地址
(2)內部引入
直接在xml中書寫dtd
<!DOCTYPE 根元素名稱[
dtd約束....
]>
2.dtd語法
(1)元素
<!ELEMENT 元素名稱 元素約束>
元素約束:
存放類型:ANY/EMPTY
元素約束:子元素的列表,將可以包含的子元素用小括號括起來
子元素之間可以使用逗號進行分割,表明子元素必須按照順序出現
子元素之間可以使用豎線進行分割,表面子元素出現其中之一
#PCDATA 表明包含標籤體
+ 表示一次或多次
* 0次或多次
? 0次或一次
也可以使用小括號進行組的操作
(2)屬性
<!ATTLIST 元素名
屬性名 屬性類型 屬性約束
屬性名2 屬性類型 屬性約束
......
>
屬性類型:
CDATA:表示屬性的值是一個普通字符串
ENUMERATED : 屬性的值是一個枚舉列表中的值
ID: 表明屬性的值必須在整個文檔中都是唯一的,如果有重複的id則校驗不通過,ID 屬性的值只能由字母,下劃線開始,不能使用數字,不能出現空白字符
屬性約束:
#REQUIRED --- 表明當前屬性是一個必須存在的屬性,如果這樣的屬性不存在則在校驗時會報錯
#IMPLIED --- 表明當前屬性是一個可選的屬性,可以有也可以沒有
#FIXED '固定值' --- 表明當前屬性具有一個固定值,這樣的屬性不需要進行賦值,自動就會取這個固定值爲值.如果這樣的屬性指定了一個不是固定值的值則校驗報錯
'默認值' --- 表明當前屬性具有一個默認值,如果給了其他的值就用其他值,如果沒有給值則取這個默認值
(3)ENTITY(實體)
<!ENTITY >,就是對一大段內容的引用,可以簡化代碼的複用
引用實體:在xml中引用的實體叫做引用實體
<!ENTITY 實體名稱 “實體內容” >
&實體名稱;
參數實體:在dtd中引用的實體叫做參數實體
<!ENTITY % 實體名稱 "實體內容">
%實體名稱;
三、XML編程:利用java程序去增刪改查(CRUD)xml中的數據
解析思想:
dom解析
sax解析
基於這兩種解析思想市面上就有了很多的解析api
sun jaxp既有dom方式也有sax方式,並且這套解析api已經加入到j2se的規範中,意味這不需要導入任何第三方開發包就可以直接使用這種解析方式.但是這種解析方式效率低下,沒什麼人用.
dom4j 可以使用dom方式高效的解析xml.
pull
!!dom4j
導入開發包,通常只需要導入核心包就可以了,如果在使用的過程中提示少什麼包到lib目錄下在導入缺少的包即可
四、Schema -- xml的約束技術 --- 需要掌握名稱空間的概念,會讀簡單的Schema就可以了,不需要大家自己會寫
Schema是xml的約束技術,出現的目的是爲了替代dtd
本身也是一個xml,非常方便使用xml的解析引擎進行解析
對名稱空間有非常好的支持
支持更多的數據類型,並且支持用戶自定義數據類型
可以進行語義級別的限定,限定能力大大強於dtd
相對於dtd不支持實體
相對於dtd複雜的多,學習成本比較的高
如何在xml中引入Schema --- !!!!!名稱空間的概念:全世界獨一無二的名字,用來唯一的標識某個資源,通常是公司的域名,只是名字而已並不真的表示資源的位置.
~~~ Schema的語法---參照Schema的文檔,瞭解即可