憑什麼XML是格式嚴格的HTML,我就像寫HTML一樣語法鬆散地寫,又能怎麼樣?
什麼是約束
由於HTML的語法格式鬆散性,很容易發生各種各樣的錯誤。於是,出現XML,要求開發者在編寫時,嚴格按照語法格式來書寫。
XML中有兩種約束技術:
DTD約束
:語法相對簡單,功能也相對簡單。Schema約束
:語法相對複雜,功能也相對強大。
DTD約束
Document Type Definition,全稱爲文檔類型定義。w3c有此技術的教程!
導入
導入只能出現在第二行,即<?xml version=”1.0” encoding=”utf-8”?>
之後。
內部導入:
就是把約束寫在本個XML文件裏面。只對當前XML有效。
外部導入
方式一:本地文件系統導入
<!DOCTYPE 根元素 SYSTEM "約束所在的本地位置">
方式二:公共的外部導入
<!DOCTYPE 根元素 PUBLIC "約束所在的網絡位置">
DTD約束標籤語法
語法格式:
<!ELEMENT 元素名稱 類別> 或 <!ELEMENT 元素名稱 (元素內容)>
類別:
- 空標籤: EMPTY。表示元素一定是空元素。
- 普通字符串: (#PCDATA)。表示元素的內容一定是普通字符串(不能含有子標籤)。
- 任何內容: ANY。表示元素的內容可以是任意內容(包括子標籤)
快速理解約束標籤寫法
<!ELEMENT web-app (servlet*,servlet-mapping*,welcome-file-list?) >
<!-- 含義說明:
web-app包括三個標籤,且必須順序出現
servlet:子標籤個數任意;
servlet-mapping:子標籤個數任意;
welcome-file-list:子標籤最左只出現一次;
-->
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file)) >
<!-- 含義說明:
servlet有三個子標籤,且必須順序出現
servlet-name:必須由,且只能出現一次;
description:可選一次
servlet-class和jsp-file:二選一,且只能出現一次
-->
DTD約束屬性
語法格式:
<!ATTLIST 元素名稱
屬性名稱 屬性類型 默認值(即約束)
屬性名稱 屬性類型 默認值(即約束)
>
- 默認值:
#REQUIRED 屬性值是必需的
#IMPLIED 屬性不是必需的
#FIXED value 屬性不是必須的,但屬性值是固定的
- 屬性類型:控制屬性值的
CDATA :表示普通字符串
(en1|en2|..): 表示一定是任選其中的一個值
ID:表示在一個xml文檔中該屬性值必須唯一。值不能以數字開頭
完整的DTD約束文件示例
文件名:web-app_2_3.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!--
傳智播客DTD教學實例文檔。
模擬servlet2.3規範,如果開發人員需要在xml使用當前DTD約束,必須包括DOCTYPE。
格式如下:
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
-->
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
<!ELEMENT servlet-mapping (servlet-name,url-pattern+) >
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT jsp-file (#PCDATA)>
<!ELEMENT welcome-file-list (welcome-file+)>
<!ELEMENT welcome-file (#PCDATA)>
<!ATTLIST web-app version CDATA #IMPLIED>
Schema約束
XML Schema 也是一種用於定義和描述 XML 文檔結構與內容的模式語言,其出現是爲了克服 DTD 的侷限性
XML Schema比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特性:
-
XML Schema 文件自身就是一個XML文件,但它的
擴展名通常爲.xsd
。 -
一個XML Schema文檔通常稱之爲
模式文檔(約束文檔)
,遵循這個文檔書寫的xml文件稱之爲實例文檔。 -
和XML文件一樣,一個XML Schema文檔也必須有一個根結點,但這個
根結點的名稱爲Schema
。 -
編寫了一個XML Schema約束文檔後,通常需要把這個文件中聲明的元素綁定到一個URI地址上,在XML Schema技術中有一個專業術語來描述這個過程,
即把XML Schema文檔聲明的元素綁定到一個名稱空間上
,以後XML文件就可以通過這個URI(即名稱空間)來告訴解析引擎,xml文檔中編寫的元素來自哪裏,被誰約束。
名稱空間
理解命名空間:
- 如果一個XML文檔中使用了多個Schema文件,而這些Schema文件中定義了相同名稱的元素,要使用時就會出現衝突;
- 就像是一個Java文件中使用了import java.util.*和import java.sql.*時,在使用Date類時,就不確定Date是哪個包下的了;
- 於是,名稱空間就誕生了;
- 用來處理元素和屬性的名稱衝突問題,與Java中的包是同一用途;
相關特性:
- 作用:告訴xml文檔的哪個元素被哪個schema文檔約束。 在一個xml文檔中,不同的標籤可以受到不同的schema文檔的約束。
- 一個名稱空間受到schema文檔約束的情況
- 多個名稱空間受到多個schema文檔約束的情況
- 默認名稱空間的情況
- 沒有名稱空間的情況
完整的Schema約束文件示例
文件名:web-app_2_5.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/web-app_2_5"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.example.org/web-app_2_5"
elementFormDefault="qualified">
<xsd:element name="web-app">
<xsd:complexType>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="servlet">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="servlet-name"></xsd:element>
<xsd:element name="servlet-class"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="servlet-mapping">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="servlet-name"></xsd:element>
<xsd:element name="url-pattern" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="welcome-file-list">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="welcome-file" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:choice>
<xsd:attribute name="version" type="double" use="optional"></xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
模擬servlet2.5規範,如果開發人員需要在xml使用當前Schema約束,必須包括指定命名空間。
格式如下:
<web-app xmlns="http://www.example.org/web-app_2_5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
這裏寫具體的XML。。。
</web-app>