【XML】XML憑什麼是格式嚴格的?

憑什麼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 元素名稱 (元素內容)>

類別:

  1. 空標籤: EMPTY。表示元素一定是空元素。
  2. 普通字符串: (#PCDATA)。表示元素的內容一定是普通字符串(不能含有子標籤)。
  3. 任何內容: 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 元素名稱 
屬性名稱 屬性類型 默認值(即約束)
屬性名稱 屬性類型 默認值(即約束)
>
  1. 默認值:
#REQUIRED 屬性值是必需的 
#IMPLIED   屬性不是必需的 
#FIXED value 屬性不是必須的,但屬性值是固定的
  1. 屬性類型:控制屬性值的
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的優勢:

  1. XML Schema符合XML語法結構,DOM、SAX等XML API很容易解析出XML Schema文檔中的內容。
  2. XML Schema對名稱空間支持得非常好。
  3. XML Schema比XML DTD支持更多的數據類型,並支持用戶自定義新的數據類型。
  4. XML Schema定義約束的能力非常強大,可以對XML實例文檔作出細緻的語義限制。
  5. XML Schema不能像DTD一樣定義實體,比DTD更復雜,但Xml Schema現在已是w3c組織的標準,它正逐步取代DTD

Schema特性:

  1. XML Schema 文件自身就是一個XML文件,但它的擴展名通常爲.xsd

  2. 一個XML Schema文檔通常稱之爲模式文檔(約束文檔),遵循這個文檔書寫的xml文件稱之爲實例文檔。

  3. 和XML文件一樣,一個XML Schema文檔也必須有一個根結點,但這個根結點的名稱爲Schema

  4. 編寫了一個XML Schema約束文檔後,通常需要把這個文件中聲明的元素綁定到一個URI地址上,在XML Schema技術中有一個專業術語來描述這個過程,即把XML Schema文檔聲明的元素綁定到一個名稱空間上,以後XML文件就可以通過這個URI(即名稱空間)來告訴解析引擎,xml文檔中編寫的元素來自哪裏,被誰約束。

名稱空間

理解命名空間:

  • 如果一個XML文檔中使用了多個Schema文件,而這些Schema文件中定義了相同名稱的元素,要使用時就會出現衝突;
  • 就像是一個Java文件中使用了import java.util.*和import java.sql.*時,在使用Date類時,就不確定Date是哪個包下的了;
  • 於是,名稱空間就誕生了;
  • 用來處理元素和屬性的名稱衝突問題,與Java中的包是同一用途;

相關特性:

  1. 作用:告訴xml文檔的哪個元素被哪個schema文檔約束。 在一個xml文檔中,不同的標籤可以受到不同的schema文檔的約束。
  2. 一個名稱空間受到schema文檔約束的情況
  3. 多個名稱空間受到多個schema文檔約束的情況
  4. 默認名稱空間的情況
  5. 沒有名稱空間的情況

完整的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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章