天天看點

XML基礎 XML基礎

标簽 : Java基礎

XML(eXtensible Markup Language:可擴充标記型語言)被設計用來傳輸和存儲資料,可擴充說明标簽可以自定義(還可以定義中文标簽<code>&lt;貓&gt;&lt;/貓&gt;</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>&lt;person&gt;&lt;/person&gt;</code>

如果标簽沒有内容,可以在标簽内結束: <code>&lt;aa/&gt;</code>

标簽可以嵌套:<code>&lt;aa&gt;&lt;bb&gt;&lt;/bb&gt;&lt;/aa&gt;</code>

一個XML檔案中,有且僅有一個<code>根标簽</code>(其他标簽都是根标簽的子标簽)

在XML中把空格和換行都當成内容來解析,下面這兩段代碼含義是不一樣的:

标簽命名規則

标簽區分大小寫;

标簽可以是中文,但不能以數字和下劃線開頭, 也不能以xml、XML、Xml等開頭;

标簽不能包含空格和冒号;

屬性定義規範

一個标簽上可以有多個屬性, 但多個屬性名稱不能相同

屬性名稱和屬性值之間使用<code>=</code>,屬性值使用引号括起來(單引号/雙引号)

XML屬性的命名規範和元素一緻

<code>&lt;!-- XML的注釋 --&gt;</code>

注意: 注釋不能嵌套

如果要在XML中書寫特殊字元(如<code>&lt;</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>&lt;schema&gt;</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>&lt;complexType&gt;&lt;/complexType&gt;</code>中)

name: 屬性名稱

type:屬性類型

use:屬性是否必須出現

<code>maxOccurs="unbounded"</code> 表示元素可以出現任意次

通過訓示器,我們可以控制在文檔中使用元素的方式.

訓示器

釋義

<code>&lt;sequence&gt;</code>

必須按順序出現

<code>&lt;all&gt;</code>

按照任意順序出現, 但隻能出現一次

<code>&lt;choice&gt;</code>

元素隻能出現其中的一個

每個限制文檔都可以被賦予唯一的命名空間,用一個URI表示;在書寫XML時,可以通過命名空間聲明目前編寫的标簽來自哪個Schema限制文檔。如:

此處使用<code>xmlns:context</code>來聲明<code>context</code>是一個命名空間,後面對該命名空間的引用,都可以用<code>&lt;context: ...&gt;</code>.

命名空間的文法很容易讓人混淆,盡管以<code>http://</code>開始,但并不指向一個檔案,而隻是一個配置設定的名字

一個命名空間的Schema檔案具體位置,需要使用<code>schemaLocation</code>屬性來指定:

schemaLocation屬性有兩個值. a.命名空間;b.供命名空間使用的Schema位置(本地/網絡).兩者之間用空格分隔.

引入命名空間的作用是可以在一個XML文檔中引入多個Schema限制.

context.xsd

config.xml