- DTD
- schema
schema 與 DTD 的對比:
- schema符合XML的語法結構
- DOM、SAX等容易解析出XML Schema
- Schema對 名稱空間 支持得比較好
- Schema支持更多的數據類型、自定義的數據類型
- 約束能力強大
- 不能像DTD一樣定義實體,比DTD更復雜
DTD
Document Type Definition 全文檔類型定義
book.dtd 文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 書架 (書)> //復雜標簽,只能有一個根節點為書
<!ELEMENT 書 (書名,售價,作者,簡介)>
<!ELEMENT 書名 (#PCDATA)> //簡單標簽
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>
<!ELEMENT 簡介 (#PCDATA)>
引用DTD,如下xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--引入DTD文件-->
<!DOCTYPE 書架 SYSTEM "book.dtd">
<書架>
<書>
<書名>JavaWeb開發大全</書名>
<售價>g</售價>
<作者>34</作者>
<簡介>不錯啊</簡介>
</書>
</書架>
DTD的元素定義:
<!ELEMENT 元素名稱 使用規則>
使用規則如下:
使用規則 | 含義 |
---|---|
(#PCDATA) | 指示元素的主體內容只能是普通的文本.(Parsed Character Data) |
EMPTY | 用于指示元素不能包含任何子元素和文本,僅可以使用屬性。比如 |
ANY | 用于指示元素的主體內容為任意類型。 |
(子元素) | 指示元素中包含的子元素 |
(子元素) | 案例 | |||
---|---|---|---|---|
逗號分開,說明必須按照聲明順序去編寫XML文檔 | <!ELEMENT FILE (TITLE,AUTHOR,EMAIL) | |||
用“ | ”分開,說明任選其一 | <!ELEMENT FILE (TITLE | AUTHOR | EMAIL) |
元素后面沒有+*? | 表示必須且只能出現一次 | |||
元素后面 + | 表示至少出現一次,一次或多次 | |||
元素后面 * | 表示可有可無,零次、一次或多次 | |||
元素后面 ? | 表示可以有也可以無,有的話只能有一次。零次或一次 |
示例
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)*| COMMENT)>
DTD屬性定義
<!ATTLIST 元素名稱
屬性名 屬性類型 約束
屬性名 屬性類型 約束
......
>
屬性類型 | 含義 | |||
---|---|---|---|---|
CDATA | 屬性的取值為普通的文本字符串 | |||
ENUMERATED | 枚舉,只能從枚舉列表中任選其一,如(雞肉 | 牛肉 | 豬肉 | 魚肉) |
ID | 屬性的取值不能重復(不能只寫數字) |
約束 | 含義 |
---|---|
#REQUIRED | 屬性必須出現 |
#IMPLIED | 屬性可有可無 |
#FIXED | 屬性的取值為一個固定值。語法:#FIXED "固定值" |
直接值 | 屬性的取值為該默認值 |
示例
<!ATTLIST 頁面作者
姓名 CDATA #IMPLIED
年齡 CDATA #IMPLIED
聯系信息 CDATA #REQUIRED
網站職務 CDATA #FIXED "頁面作者"
個人愛好 CDATA "上網"
>
DTD 與 XML文檔關聯的三種方式
- 使用內部DTD 格式
- 使用外部DTD
- 使用網絡DTD
<!--內部關聯-->
<!DOCTYPE 根節點 [DTD的代碼 ]>
<!DOCTYPE 書架 [
<!ELEMENT 書架 (書+)>
!ELEMENT 書 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
]>
<!--外部關聯-->
<!DOCTYPE 根節點 SYSTEM “DTD的地址” >
<!--網絡關聯-->
<!DOCTYPE 根節點 PUBLIC “DTD的名稱” “DTD的地址” >
示例 使用內部DTD
<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 購物籃 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品種 ( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉">
]>
<購物籃>
<肉 品種="魚肉"/>
<肉 品種="牛肉"/>
<肉/>
</購物籃>
DTD的實體定義
-
實體用于為一段內容創建一個別名,可在XML文檔中引用這段內容
DTD中定義:<!ENTITY 別名 “值”> XML中引用:&別名
schame
book.xsd文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
在根節點上,使用屬性xmlns(xml namespace),引入W3C的名稱
屬性 targetNamespace 用于指定Schame文檔中聲明的元素屬于哪個命名空間
屬性 elementFormDefault qualified 質量好的 unqualified質量不好的
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mango.cool/110" elementFormDefault="qualified">
<element name="書架">
<complexType>
<sequence>
<element name="書">
<!-- 復雜的元素 -->
<complexType>
<!-- 有順序的 -->
<sequence>
<!-- 簡單元素 -->
<element name="書名" type="string"></element>
<element name="作者" type="string"></element>
<element name="簡介" type="string"></element>
</sequence>
<!-- 書的屬性 -->
<attribute name="出版社" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
book.xml 文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
*引入W3C名稱空間,我是實例文檔
*xmlns=""
*引入自己編寫的schema的文檔
*xmlns=""
*問題:元素不能有相同的屬性名稱
*解決 :起別名 :aa
*技巧:再出現概率較小的標簽上起別名
*引入自己編寫的schema文檔的地址
*schemalocation屬性是W3C提供的,如果W3C名稱空間有別名的haul,先把別名協商
-->
<書架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.mango.cool/110"
xsi:schemaLocation="http://www.mango.cool/110 book.xsd">
<書>
<書名>JavaWeb開發大全</書名>
<作者>34</作者>
<簡介>不錯啊</簡介>
</書>
</書架>
Schame約束,開發XML的過程
W3C預先定義元素和屬性 --> schame文檔 --> xml文檔
名稱空間的概念
每個約束文檔都可以被賦予一個唯一的名稱空間,名稱空間用一個唯一的URI表示;盡管以http://開始,但是并不指向一個包含模式定義的文件。事實上,該url不指向任何文件,只是一個分配的名字
schema 示例 包含兩個.xsd文件,一個.xml文件
company.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/company"
elementFormDefault="qualified">
<element name="company">
<complexType>
<sequence>
<element name="employee">
<complexType>
<sequence>
<!-- 引用任何一個元素 -->
<any></any>
<!-- 員工名稱 -->
<element name="name">
<complexType>
<simpleContent>
<extension base="string"></extension>
</simpleContent>
<attribute name="salary" type="double"></attribute>
</complexType>
</element>
</sequence>
<!-- 為employee元素添加屬性 -->
<attribute name="age" type="int"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
<company>
<employee>
<abc></abc>
</employee>
</company>
department.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/department"
elementFormDefault="qualified">
<!-- 部門名稱 -->
<element name="name" type="string"></element>
</schema>
company.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 數據文件 引用多個Schema -->
<company xmlns = "http://www.example.org/company"
xmlns:dept="http://www.example.org/department"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/company company.xsd http://www.example.org/department department.xsd"
>
<employee age="30">
<!-- 部門名稱 -->
<dept:name>人力資源部</dept:name>
<!-- 員工名稱 -->
<name salary="3000.00">王曉曉</name>
</employee>
</company>