标簽 : Java基礎
XML(eXtensible Markup Language:可擴充标記型語言)被設計用來傳輸和存儲資料,可擴充說明标簽可以自定義(還可以定義中文标簽<code><貓></貓></code>),XML有1.0/1.1兩個版本,但一般使用都是1.0版本(由于1.1版本不能向下相容).
XML用于傳輸/存儲資料
不同的系統之間傳輸資料,如IM之間資料的傳輸;
用來表示有層級關系的資料:
經常用在檔案配置, 如Spring, MyBatis的配置檔案(比如将資料庫資訊都放到配置檔案中,如果需要修改資料庫配置,并不需要修改源代碼,隻修改XML配置檔案即可)
屬性
version:xml的版本 1.0
encoding:xml編碼 utf-8
standalone:是否需要依賴其他檔案 yes/no
XML中文亂碼原因:儲存的編碼和打開的編碼不一緻
有開始必須要有結束:<code><person></person></code>
如果标簽沒有内容,可以在标簽内結束: <code><aa/></code>
标簽可以嵌套:<code><aa><bb></bb></aa></code>
一個XML檔案中,有且僅有一個<code>根标簽</code>(其他标簽都是根标簽的子标簽)
在XML中把空格和換行都當成内容來解析,下面這兩段代碼含義是不一樣的:
标簽命名規則
标簽區分大小寫;
标簽可以是中文,但不能以數字和下劃線開頭, 也不能以xml、XML、Xml等開頭;
标簽不能包含空格和冒号;
屬性定義規範
一個标簽上可以有多個屬性, 但多個屬性名稱不能相同
屬性名稱和屬性值之間使用<code>=</code>,屬性值使用引号括起來(單引号/雙引号)
XML屬性的命名規範和元素一緻
<code><!-- XML的注釋 --></code>
注意: 注釋不能嵌套
如果要在XML中書寫特殊字元(如<code><</code>),需要對其轉義(如<code>$lt</code>), 規則同HTML.
如果有多個字元都需要進行轉義,如
則可以将這些内容放到<code>CDATA</code>區中:
CDATA區文法
<code>CDATA</code>區内的特殊字元被當做文本内容,而不是标簽.
XML限制:規定XML中隻能出現的元素以及元素的形式,包含<code>DTD</code>限制(如:MyBatis)和<code>Schema</code>限制(如:Spring)兩種.
書寫
引入
注: 如果想要校驗XML限制,需要使用工具(比如IDEA),浏覽器隻負責校驗XML文法,不負責校驗限制.
引入本地dtd檔案
引用内部的dtd檔案(不推薦)
引用網絡dtd檔案(最常用)
MyBatis的<code>mapper</code>配置檔案
MyBatis的<code>config</code>配置檔案
簡單元素(沒有子元素的元素)
屬性:
<code>(#PCDATA)</code> : 指定字元串類型
<code>EMPTY</code> : 為空
<code>ANY</code> : 任意,可以為空/也可以不為空
複雜元素
預設子元素隻能出現一次
符号
出現次數
<code>+</code>
一次或者多次
<code>*</code>
零次或者多次
<code>?</code>
零次或者一次
分隔符:
子元素直接使用<code>,</code>分隔,表示元素按順序定義
子元素直接使用<code>|</code>分隔,表示元素隻能出現其中的任意一個
屬性類型
解釋
<code>CDATA</code>
字元串(常用)
枚舉
枚舉值之一
<code>ID</code>
約定值隻能以字母/下劃線開頭
屬性的限制
限制
<code>#REQUIRED</code>
屬性必須存在(常用)
<code>#IMPLIED</code>
屬性可有可無(常用)
<code>#FIXED</code>
表示一個固定值 #FIXED “AAA”, 屬性的值必須是設定的這個固定值(不要與枚舉類型一起用)
預設值
如果沒有在XML中定義該屬性,則使用預設值
<code>#FIXD</code>固定值
模拟Spring限制
根據DTD限制可以寫出XML如下:
相比DTD限制, Schema更符合XML的文法,Schema直接使用XML語句.
一個XML檔案隻能有一個DTD,但可以有多個Schema(使用命名空間區分,類似Java包);
DTD裡面隻有<code>PCDATA</code>類型,但Schema可以支援更多的資料類型;
Schema文法更加複雜, 可以對XML做出更加細緻的語意限制, 但Schema目前并未完全替代DTD.
Schema檔案的字尾名為<code>.xsd</code>, 根标簽為<code><schema></code>
<code>xmlns="http://www.w3.org/2001/XMLSchema"</code>
表示目前XSD是一個限制檔案
<code>targetNamespace="http://www.fq.me/context"</code>
Schema命名空間,如果XML需要使用目前限制檔案,需要通過這個位址引入該限制檔案
<code>elementFormDefault="qualified"</code>
表明該Schema是品質良好的,所有全局元素的子元素将被以預設方式放到目标命名空間;
<code>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</code>
表示目前XML是被限制的檔案
<code>xmlns="http://www.fq.me/context"</code>
限制文檔中的<code>targetNamespace</code>
<code>xsi:schemaLocation="http://www.fq.me/context constraint.xsd"</code>
Schema限制檔案的location: <code>targetNamespace</code>+<code>限制檔案路徑</code>
簡單元素
必須是複雜元素才能有屬性(寫在<code><complexType></complexType></code>中)
name: 屬性名稱
type:屬性類型
use:屬性是否必須出現
<code>maxOccurs="unbounded"</code> 表示元素可以出現任意次
通過訓示器,我們可以控制在文檔中使用元素的方式.
訓示器
釋義
<code><sequence></code>
必須按順序出現
<code><all></code>
按照任意順序出現, 但隻能出現一次
<code><choice></code>
元素隻能出現其中的一個
每個限制文檔都可以被賦予唯一的命名空間,用一個URI表示;在書寫XML時,可以通過命名空間聲明目前編寫的标簽來自哪個Schema限制文檔。如:
此處使用<code>xmlns:context</code>來聲明<code>context</code>是一個命名空間,後面對該命名空間的引用,都可以用<code><context: ...></code>.
命名空間的文法很容易讓人混淆,盡管以<code>http://</code>開始,但并不指向一個檔案,而隻是一個配置設定的名字
一個命名空間的Schema檔案具體位置,需要使用<code>schemaLocation</code>屬性來指定:
schemaLocation屬性有兩個值. a.命名空間;b.供命名空間使用的Schema位置(本地/網絡).兩者之間用空格分隔.
引入命名空間的作用是可以在一個XML文檔中引入多個Schema限制.
context.xsd
config.xml