溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

XML系列:(2)XML約束

發(fā)布時(shí)間:2020-06-24 20:11:47 來源:網(wǎng)絡(luò) 閱讀:563 作者:lsieun 欄目:開發(fā)技術(shù)

1、什么是XML約束


在XML技術(shù)中,可以編寫一個(gè)文檔來約束一個(gè)XML文檔的書寫規(guī)范,這稱之為XML約束。

2、XML語(yǔ)法和XML約束的區(qū)別


XML語(yǔ)法和XML約束的區(qū)別

作用制定者
XML語(yǔ)法規(guī)范XML文件的基本編寫規(guī)則由w3c組織制定的
XML約束規(guī)范XML文件數(shù)據(jù)內(nèi)容格式的編寫規(guī)則由開發(fā)者自行定義


3、常用的XML約束技術(shù)


DTD約束:語(yǔ)法相對(duì)簡(jiǎn)單,功能也相對(duì)簡(jiǎn)單。學(xué)習(xí)成本也低。

Schema約束:語(yǔ)法相對(duì)復(fù)雜,功能也相對(duì)強(qiáng)大。學(xué)習(xí)成本相對(duì)高?。。。Q空間)

4、XML約束DTD


DTD(Document Type Definition):文檔類型定義

4.1、DTD與XML文件關(guān)聯(lián)的三種方式


三種方式:內(nèi)部DTD、引用本地DTD和引用公共DTD

4.1.1、內(nèi)部DTD


語(yǔ)法:

<!DOCTYPE 根元素 [元素聲明]>

實(shí)例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[
   <!ELEMENT note (to,from,heading,body)>
   <!ELEMENT to (#PCDATA)>
   <!ELEMENT from (#PCDATA)>
   <!ELEMENT heading (#PCDATA)>
   <!ELEMENT body (#PCDATA)>
]>
<note>
   <to>美國(guó)</to>
   <from>中國(guó)</from>
   <heading>Hello</heading>
   <body>主體</body>
</note>




4.1.2、引用本地DTD


語(yǔ)法:

<!DOCTYPE 根元素 SYSTEM "文件名">

實(shí)例:

文件note.dtd

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

文件note.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
   <to>美國(guó)</to>
   <from>中國(guó)</from>
   <heading>Hello</heading>
   <body>主體</body>
</note>




4.1.3、引用公共DTD


語(yǔ)法:

<!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文件的URL">

實(shí)例:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">



4.2、DTD語(yǔ)法



4.2.1、元素


元素聲明使用下面的語(yǔ)法:

<!ELEMENT 元素名稱 類別>

或者

<!ELEMENT 元素名稱 (元素內(nèi)容)>

類別:


元素的類別
類型類型值作用
空標(biāo)簽EMPTY表示元素一定是空元素
普通字符串(#PCDATA)表示元素的內(nèi)容一定是普通字符串(不能含有子標(biāo)簽)
任何內(nèi)容ANY表示元素的內(nèi)容可以是任意內(nèi)容(包括子標(biāo)簽)

(元素內(nèi)容)

順序問題:<!ELEMENT 元素名稱 (子元素名稱 1,子元素名稱 2,.....)>  按順序出現(xiàn)子標(biāo)簽

次數(shù)問題:

元素出現(xiàn)的次數(shù)
標(biāo)簽含義語(yǔ)法示例
(空)必須且只出現(xiàn)1次<!ELEMENT 元素名稱 (子元素名稱)><!ELEMENT note (message)>
+至少出現(xiàn)1次<!ELEMENT 元素名稱 (子元素名稱+)><!ELEMENT note (message+)>
*0或n次<!ELEMENT 元素名稱 (子元素名稱*)><!ELEMENT note (message*)>
?0 或1次<!ELEMENT 元素名稱 (子元素名稱?)><!ELEMENT note (message?)>



4.2.2、屬性


語(yǔ)法:

<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認(rèn)值>

<!ATTLIST 元素名稱
                屬性名稱 屬性類型 默認(rèn)值
                屬性名稱 屬性類型 默認(rèn)值
                ...
>


默認(rèn)值:

#REQUIRED 屬性值是必需的

#IMPLIED   屬性不是必需的

#FIXED value 屬性不是必須的,但屬性值是固定的

屬性類型:控制屬性值的

CDATA :表示普通字符串

(en1|en2|..): 表示一定是任選其中的一個(gè)值,枚舉值

ID:表示在一個(gè)xml文檔中該屬性值必須唯一。值不能以數(shù)字開頭



4.2.3、實(shí)體


實(shí)體是用于定義引用普通文本或特殊字符的快捷方式的變量。

在DTD定義中,通過定義一個(gè)實(shí)體,在 XML文件中就可以引用這個(gè)實(shí)體了。

語(yǔ)法:

<!ENTITY 實(shí)體名稱 "實(shí)體的值">

實(shí)例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Persons[
	<!ENTITY author "張三">
	<!ENTITY home "中國(guó) 北京">
]>
<Persons>
&author;住在&home;
</Persons>

展示:

XML系列:(2)XML約束

注釋: 一個(gè)實(shí)體由三部分構(gòu)成: 一個(gè)和號(hào) (&), 一個(gè)實(shí)體名稱, 以及一個(gè)分號(hào) (;)。

5、Schema


XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 描述 XML 文檔的結(jié)構(gòu)。

XML Schema 語(yǔ)言也稱作 XML Schema 定義(XML Schema Definition,XSD)。


5.1、XML Schema與DTD


XML Schema符合XML語(yǔ)法結(jié)構(gòu),本身就是XML文檔

DTD文檔的結(jié)構(gòu)是平鋪性,如果定義復(fù)雜的XML文檔,很難把握各元素之間的嵌套關(guān)系, Schema相對(duì)文檔結(jié)構(gòu)較強(qiáng)

XML Schema比DTD支持更多的數(shù)據(jù)類型,并支持用戶自定義數(shù)據(jù)類型

XML Schema定義約束的能力更強(qiáng)大

XML Schema 對(duì)命名空間進(jìn)行支持


5.2、XML Schema快速入門


Schema本身就是一個(gè)XML文檔,但擴(kuò)展名為.xsd。

一個(gè)Schema文檔通常稱之為約束文檔,遵循這個(gè)約束書寫的XML文件稱之為實(shí)例文檔。

和XML文件一樣,一個(gè)Schema文檔必須有一個(gè)根節(jié)點(diǎn),并且這個(gè)根節(jié)點(diǎn)的名稱必須為schema。

編寫一個(gè)Schema文檔后,通常需要把這個(gè)文件中聲明元素綁定到一個(gè)URI上, 在XML Schema技術(shù)中有一個(gè)專業(yè)術(shù)語(yǔ)來描述這個(gè)過程,即把XML Schema文檔聲明的元素綁定到一個(gè)名稱空間上, 以后XML文件就可能通過這個(gè)URI(即名稱空間)來告訴解析引擎,XML文檔中編寫的元素來自哪里,被誰(shuí)約束。

5.3、實(shí)例


books.xsd(XML Schema文件)

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.rk.com/books" 
	elementFormDefault="qualified">
	<!-- targetNamespace 表示當(dāng)前XML Schema文檔中聲明的元素定義在http://www.rk.com/books命名空間中 -->
	<!-- elementFormDefault="qualified"表示在此schema中聲明過的元素必須被命名空間限定 -->
	<element name="books"><!-- name屬性表示當(dāng)前元素的“標(biāo)簽名” -->
		<complexType><!-- 復(fù)雜元素,由complexType進(jìn)行定義 -->
			<sequence><!-- 子元素序列 -->
				<element name="book" maxOccurs="unbounded">
					<complexType>
						<sequence>
							<element name="title" type="string"/><!-- 簡(jiǎn)單元素,由type屬性進(jìn)行定義 -->
							<element name="price" type="double"/>
							<any></any><!-- 后面可以任意寫 -->
						</sequence>
						<!-- 屬性的聲明 一般寫到 sequence 的后面 -->
						<attribute name="id" type="ID" use="required"/>
					</complexType>
				</element>
			</sequence>
		</complexType>
	</element>
</schema>


books.xml(XML實(shí)例文件)

<?xml version="1.0" encoding="UTF-8"?>
<rk:books xmlns:rk="http://www.rk.com/books" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://www.rk.com/books books.xsd ">
	<!-- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 是固定寫法,實(shí)例命名空間 -->
	<!-- xsi:schemaLocation此屬性就有兩個(gè)值:第一值是需要使用的命名空間;第二個(gè)值是該命名空間使用的XML Schema的位置 -->
  <rk:book id="b1">
    <rk:title>往事并不如煙</rk:title>
    <rk:price>49.9</rk:price>
  </rk:book>
  <rk:book id="b02">
  	<rk:title>XML學(xué)習(xí)</rk:title>
  	<rk:price>23.2</rk:price>
  </rk:book>
</rk:books>

booksWithDefaultNameSpace.xml(XML實(shí)例文件)

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.rk.com/books" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://www.rk.com/books books.xsd ">
	<!-- 使用默認(rèn)命名空間 格式:xmlns="http://www.rk.com/books" -->
	<!-- 一個(gè)XML實(shí)例文檔只允許有一個(gè)默認(rèn)命名空間 -->
  <book id="b1">
    <title>最后的貴族</title>
    <price>49.9</price>
  </book>
</books>





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI