1. 程式人生 > >XML約束(3)

XML約束(3)

進行 復雜 部分 family 語言 是否 base ttl 聲明

本節要點:

  • 了解XML的約束模式
  • 了解DTD
  • 了解Schema

1 了解XML的約束模式

計算機程序在處理XML文檔之前,必須能夠解析出XML文檔的內容中各個元素的相關信息。將解析出來的信息再交給下遊程序進行下一步處理。Parser就是用於解析XML文檔的解析器程序,Parser可以獨立使用,也可以成為編輯軟件或瀏覽器的一部分。

所以XML文檔必須嚴格遵循一定的語法,遵守XMl基本語法規則和規範的XML文檔就稱為Well-formed XML。一個XML文檔必須是格式良好的,並且內容滿足某些條件的約束。

約束模式是一套規則,對XML文檔中的內容作出限制。約束模式定義了XML文檔中允許出現的元素名,元素中的屬性,內容類型,及元素間的嵌套關系和出現順序。

約束模式通常都在一個單獨的文件中進行定義。約束模式的內容也需要遵循一定的語法規則,使用XML約束模式語言來定義XML約束模式的語法規則,模式文檔采用某種約束模式語言編寫如:XML DTD、XDR、SOX、XML Schema等,應用最廣泛和具有代表意義的是XML DTD和XML Schema。

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)