XML約束(3)
本節要點:
- 了解XML的約束模式
- 了解DTD
- 了解Schema
1 了解XML的約束模式
計算機程序在處理XML文檔之前,必須能夠解析出XML文檔的內容中各個元素的相關信息。將解析出來的信息再交給下遊程序進行下一步處理。Parser就是用於解析XML文檔的解析器程序,Parser可以獨立使用,也可以成為編輯軟件或瀏覽器的一部分。
所以XML文檔必須嚴格遵循一定的語法,遵守XMl基本語法規則和規範的XML文檔就稱為Well-formed XML。一個XML文檔必須是格式良好的,並且內容滿足某些條件的約束。
約束模式是一套規則,對XML文檔中的內容作出限制。約束模式定義了XML文檔中允許出現的元素名,元素中的屬性,內容類型,及元素間的嵌套關系和出現順序。
2 DTD
XML DTD(Document Type Definition 文檔類型定義)
- 最早出現的一種XML約束模式語言
- 目前使用最廣泛的一種XML約束模式
- 以.dtd為擴展名
- Struts使用較多
有效的XML必須遵循XML 的基本語法規則,且符合為它指定的某個XML約束模式的XML文檔。校驗是將一個XML文檔和它所引用的XML約束模式進行比較分析,看其中的內容是否符合XML約束模式的過程。
2.1 DTD語法
l DTD(document type definition):文檔類型定義
l 作用:約束XML的書寫規範
1.一個簡單例子
book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "../dtd/books.dtd"> <books> <book> <author>張三</author> <title>一本好書</title> <price>20.00</price> </book> </books>
books.dtd
<!ELEMENT books (book+)> <!ELEMENT book (author,title,price)> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT price (#PCDATA)>
註:元素和子元素屬性之間有空格分隔,如author (#PCDATA)
1) 元素聲明語法
語法格式:
<!ELEMENT 元素名稱 使用規則>
使用規則:
定義元素中包含的組成部分,以及每種組成成分出現的次數、次序,還可以是某些成分進行某種關系組合後出現的次數、次序。
元素通配符使用
元字符 |
含義 |
+ |
出現一次或多次 |
* |
出現零次或多次 |
? |
可選,不出現或出現一次 |
( ) |
一組要共同匹配的表達式 |
| |
或(OR) |
元素A, 元素B, 元素C |
元素之間以逗號分割,要求嚴格遵從順序要求 |
元素A 元素B 元素C |
元素之間以空格分割,無須遵從順序要求 |
示例:
(book+):表示books元素中可以包含一個或多個book元素
(title,author,price)
- 表示book元素中要嵌套title、author、price子元素,並且這些子元素要按順序依次出現,只能出現一次
- 如果沒有“,”隔開,表示各子元素可以任意次序出現,但必須且只能出現一次
- 如果使用“|”隔開,表示只能出現它們之中的任何一個
(#PCDATA)
用於表示元素中的內容是普通文本字符串。
2) 屬性聲明語法
語法格式:
<!ATTLIST 標簽名 屬性列表 屬性類型 出現方式>
“出現方式”設置
設置 |
描述 |
#REQUIRED |
表示這個屬性是必須的 |
#IMPLIED |
表示這個屬性的值是可選的 |
#FIXED |
表示這個屬性有一個固定的不能更改的值 |
默認 |
表示這個屬性有一個默認值 |
“屬性類型”設置
設置 |
描述 |
CDATA |
文本類型 |
Enumerated |
一個字符串值得枚舉,表示可以任選其中一個 |
ID |
表示唯一標示符(註:由ID表示的屬性不能以數字開頭) |
ENTITY |
一個外部實體(現在的瀏覽器不支持) |
示例:
books.dtd
<!ELEMENT books (book+)> <!ELEMENT book ((author,title,price)|comment+)> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT price (#PCDATA)>
<!ATTLIST comment author CDATA #IMPLIED title CDATA #REQUIRED price CDATA #IMPLIED language CDATA #FIXED "Chinese" type (java|.net|oracle) "java" id ID #REQUIRED > |
Books.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "books.dtd"> <books> <book> <author>joy</author> <title>java core</title> <price>100</price> </book> <book> <comment id="S001" author="joy" title="Java" price="20" language="Chinese" /> <comment id="S002" author="joy" title="Java" price="20" language="Chinese" /> </book> </books> |
2.2 引入外部DTD文件
使用文檔類型聲明DOCTYPE語句引入DTD。格式如下:
<!DOCTYPE 文檔類型名稱 SYSTEM “DTD文件的URL”>
<! DOCTYPE 文檔類型名稱 PUBLIC “DTD名稱” “DTD文件的URL”>
註:
- 文檔類型名稱由編寫者自己定義,通常是使用XML文檔的根元素名稱作為文檔類型名稱
- SYSTEM表示XML文檔所遵循的是一個本地或者組織內部所編寫和使用的DTD文件
- PUBLIC表示XML文檔遵循的是一個由權威機構制定的,公開提供給特定行業或公眾使用的DTD文件
- “DTD名稱”需要使用雙引號括起來,應該符合一些標準的規定
- SYSTEM 後面的“DTD文件的URL”可以是相對URL,也可以是絕對URL;PUBLIC 後面的“DTD文件的URL” 指定DTD文件在Internet上的絕對URL
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">中:
ü “-” 表示ISO標準的DTD,“+”被改進的非ISO標準的DTD,“-”未被改進的非ISO標準的DTD
ü “Apache Software Foundation”表示 DTD所有者的名稱
ü “DTD Struts Configuration 2.3”表示DTD所描述的文件的說明
ü “EN“表示DTD語言的種類
2.3 嵌入DTD定義語句
可以在XML中嵌入使用DTD。
語法格式:
3 Schema
XML Schema
- 對XML文檔內容進行約束的另外一種模式
- 目的是為了克服DTD的局限性,為XML提供豐富的語法結構
- XML Schema已經成為W3C的正式推薦標準
- 以.xsd為擴展名
XML Schema VS DTD:
- XML Schema符合XML語法結構。
- DOM、SAX等XML API很容易解析出XML Schema文檔中的內容。
- XML Schema對名稱空間支持得非常好。
- XML Schema比XML DTD支持更多的數據類型,並支持用戶自定義新的數據類型。
- XML Schema定義約束的能力非常強大,可以對XML實例文檔作出細致的語義限制。
- XML Schema不能像DTD一樣定義實體,比DTD更復雜,但Xml Schema現在已是w3c組織的標準,它正逐步取代DTD。
schema的基礎是數據類型,理解schema的最好方式是將它看成是數據類型的層次結構,在層次結構的底層是內置的不可再劃分的數據類型,如:整數、字符串、浮點數、日期等,表示xml文件可能包含的數據的基本單元。通過組合這些簡單的數據類型,可以創建出各種不同的復雜數據類型,然後可以使用這些數據類型來定義元素和屬性。這樣,你將為xml文檔的根元素、子元素、一直到最底層的包含文檔數據的元素定義數據類型,因此,學習創建xsd schema,大體上就成了一個定義數據類型的過程。
示例:(簡單)
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/fullname" xmlns:tns="http://www.example.org/fullname" elementFormDefault="qualified"> <!-- xmlns: xml name space 導入一個w3的名稱空間,用來支持基礎數據類型等 targetNamespace:可以等同於java裏面定義的包名 xmlns:tns :給命名空間取個別名 --> <element name="fullname" type="tns:fnm"></element> <complexType name="fnm"> <sequence> <element name="first-name" type="string"></element> <element name="last-name" type="string"></element> </sequence> </complexType> </schema> |
<?xml version="1.0" encoding="UTF-8"?> <fullname xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.example.org/fullname" xsi:schemaLocation="http://www.example.org/fullname fullname.xsd"> <first-name>zhou</first-name> <last-name>xiaoxiao</last-name> </fullname> |
示例:(復雜點)
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/factory" xmlns:pre="http://www.example.org/factory" elementFormDefault="qualified"> <element name="factory" type="pre:fac"></element> <complexType name="fac"> <sequence maxOccurs="unbounded"> <element name="worker"> <complexType> <attribute name="id" type="ID" use="required"></attribute> <attribute name="name" type="string"></attribute> <attribute name="age"> <simpleType> <restriction base="unsignedInt"> <maxInclusive value="80"></maxInclusive> <minInclusive value="1"></minInclusive> </restriction> </simpleType> </attribute> <attribute name="sex" > <simpleType> <restriction base="string"> <enumeration value="男"></enumeration> <enumeration value="女"></enumeration> </restriction> </simpleType> </attribute> </complexType> </element> </sequence> </complexType> </schema> |
<?xml version="1.0" encoding="UTF-8"?> <factory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.example.org/factory" xsi:schemaLocation="http://www.example.org/factory factory.xsd"> <worker id="w001" name="jack" age="25" sex="男"/> <worker id="w002" name="tom" age="24" sex="男"/> <worker id="w003" name="mary" age="26" sex="女"/> </factory> |
作業:
1.XML文檔默認的編碼方式是:( )
A. ASCII B. Unicode C. UTF-16 D. UTF-8
2.下列元素定義中正確是:( )
A. <book></Book> B. <BOOK></book>
C. <book></book> D. <Book></bOOK>
3. W3C XML Schema文檔中,attribute元素的屬性use值為( )表示屬性是可選的並且可以具有任何值。
A. optional B. prohibited
C. required D. fixed
4. XML ( )提供了一種避免元素命名沖突的方法。
A.命名空間 B.DTD C.XSD D.XSL
5.描述學校、班級(1-n個班,屬性:班級號)、班主任(每個班只有一個)、學生(每個班有多個學生,屬性:學號(必須)、姓名(必須)、性別(可選)、生日(可選,必須日期))
6.寫出出下面DTD的一個有效的XML
<! ELEMENT 聯系人 (姓名,(電話|EMAIL),地址?)>
<! ELEMENT 姓名 (#PCDATA)>
<! ELEMENT 電話 (#PCDATA)>
<! ELEMENT EMAIL (#PCDATA)>
<! ELEMENT 地址 (街道,城市,省份)>
<! ELEMENT 街道 (#PCDATA)>
<! ELEMENT 城市 (#PCDATA)>
<! ELEMENT 省份 (#PCDATA)>
XML約束(3)