XML | DTD | Schema


XML

可擴展標記語言 Extensible Markup Language ,類似HTML,但和HTML完全不一樣。目前遵循xml1.0規範。它是通用的數據交換格式。

允許用戶自定義標籤。一個標籤用於描述一段數據。

XML作用

  • 用於客戶端Client和服務器Server之間傳遞數據
    • 服務器就是裝着服務端程序的高配置電腦,配置較高,CPU一般用intel的志強處理器。
  • 保存有關係的數據
  • 用作軟件配置文件
  • 對安卓層次來講,界面佈局文件還有manifest清單文件
  • 提高系統的靈活性

XML語法

文檔聲明

文檔聲明出現的位置必須在xml文件第一行

<?xml version="1.0"?>

保存的時候xml聲明的編碼要跟文件保存的編碼保持一直,如果不聲明編碼。默認使用的是utf-8

比如:

<?xml version="1.0"?>
<中國>
	<河南>
		<鄭州></鄭州>
		<洛陽></洛陽>
	</河南>
</中國>

中文編碼規則:gbk(大概2w漢字)gb2312(大概5k漢字)utf-8

手動聲明編碼規則:

<?xml version="1.0" encoding="gbk"?>

還有個standalone說明文檔是否獨立,是否依賴其他文檔,如:

<?xml version="1.0" encoding="gbk" standalone="yes"?>

元素

元素指文件中出現的標籤,一個標籤分爲起始和結束標籤(不能省略),標籤是必須閉合的

一個標籤允許嵌套標籤,但是要注意層次順序,先開始後閉合,後開始先閉合。

一個XML文檔必須有且僅有一個根標籤,其他標籤都是其後代標籤

<tag></tag>

注意:XML文檔並不會忽略\r\n \t等等

命名規範:

  • 區分大小寫
  • 不能以數字或下劃線開頭
  • 不能用xml保留字
  • 不能包含空格
  • 名稱中間不能包含冒號:

屬性

  • 屬性要寫在開始標籤
  • 屬性名稱的命名規範與元素命名規範相同
  • 屬性一定要用引號(單或雙都行)引起來
  • 屬性可以用子標籤的形式來表示

下面這段代碼用了兩種方式:

<?xml version="1.0"?>
<Persons>
	<person name='wzq'>
    	<firstName>zq</firstName>
        <lastName>w</lastName>
    </person>
</Persons>

註釋

語法格式爲:

<!-- 我是註釋 -->

注意:

  • 註釋不能放在第一行,第一行必須是文檔聲明
  • 註釋不能嵌套
  • eclipse快捷鍵ctrl+shift+/

CDATA區

CDATA裏面的內容不會被解析器解析

<![CDATA[]]>

他的作用就是:比如我們的XML文檔裏面要寫一些xml不允許的語法比如大於號>小於號<等特殊字符,這時候就用CDATA進行聲明。

比如:

<?xml version="1.0"?>
<persons>
	<person>
    	<![CDATA[<firstName> <w><w><w> </firstName>]]>
        <lastName>wzq</lastName>
    </person>
</persons>

特殊字符

對於一些特殊字符,若要在主題元素中顯示,必須轉義

特殊字符 轉義替代符號
& &amp;
< &lt;
> &gt;
" &quot;
&apos;

XML約束

爲什麼要使用約束?

XML都是用戶自定義的標籤,若出現小小的錯誤,軟件程序將不能正確的獲取文件中的內容而報錯。

  • 格式良好的XML:遵頊XML語法的XML

  • 有效的XML:遵循約束文檔的XML

格式良好的不一定有效,有效的一定格式良好

XML技術中,可以編寫一個文檔來約束一個XML的書寫規範,這個文檔稱爲約束文檔

總之:約束文檔定義了XML中允許出現的元素名稱,屬性及元素出現的順序

常用的約束技術:

  • XML DTD
  • XML Schema

DTD(Document Type Definition)

文檔類型定義。編碼必須使用UTF-8

作用:約束XML書寫規範

注意:DTD可以寫在單獨的文件中,擴展名是dtd,編碼必須是utf-8

引入外部DTD文檔

第一種方式:當引用的DTD文檔在本地時,可以這樣寫:

<!DOCTYPE 根元素 SYSTEM "book.dtd">

比如:

<!DOCTYPE 書架 SYSTEM "book.dtd">

第二種方式:當引用的DTD文檔在公共網絡上,這樣寫:

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

比如:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,lnc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

在文檔內部編寫

DTD約束文檔可以在XML文檔種直接定義,(編碼沒有要求)

DTD語法——定義元素

在DTD文檔種使用ELEMENT關鍵字來聲明一個XML元素

語法:

<!ELEMENT 元素名稱 使用規則>

使用規則:

  • (#PCDATA):指示元素內容只能時普通的文本
  • EMPTY:用於指示元素的主體爲空
  • ANY:用於指示元素的主題內容爲任意類型
  • (子元素):指示元素種包含的子元素

定義子元素及描述他們的關係:

  • 如果子元素用逗號分開,數媒必須按照聲明順序去寫XML文檔
  • 如果子元素用|,說明任選其一
  • + * ?來表示元素出現的此輸
    • 如果子元素後面沒有+ * ?說明必須出現一次
    • +表示至少出現一次
    • *表示可有可無
    • ?表示0或1次

DTD語法——定義屬性

ATTLIST關鍵字來爲一個元素聲明屬性,語法:

<!ATTLIST 元素名稱 屬性名1 屬性值類型 設置說明……>

屬性值類型:

  • CDATA:表示屬性的取值爲普通的文本字符串
  • (a|b|c):說明只能從中任選其一
  • ID:表示屬性的取值不能重複

設置說明:

  • #REQUIRED:表示該屬性必須出現
  • #IMPLIED:表示該屬性可有可無
  • #FIXED:表示屬性的取值爲一個固定值,語法#FIXED "固定值"

DTD語法——定義引用實體

在DTD中定義,在XML中使用

語法:

<!ENTITY 實體名稱 "實體內容">

引用:

&實體名稱

DTD約束實例

<?xml version="1.0"?>
<!DOCTYPE 書架(書+)[
	<!ELEMENT 書架 (書+)>
	<!ELEMENT  (書名,作者,售價)>
	<!ELEMENT 書名 (#PCDATA)>
	<!ELEMENT 作者 (#PCDATA)>
	<!ELEMENT 售價 (#PCDATA)>
	<!ATTLIST 
		ISBN ID #REQUIRED
		COMMENT CDATA #IMPLIED
		STYLE (a|b) #IMPLIED
		出版社 CDATA "demo"
	>
	<!ENTITY JY "金庸">
]>
<書架>
	< ISBN='a' COMMENT='ddd' STYLE='a'>
        <書名>射鵰英雄傳</書名>
        <作者>&JY</作者>
        <售價>0$</售價>
    </>
    < ISBN='b' STYLE='b'>
    	<書名>神鵰俠侶</書名>
        <作者>金庸</作者>
        <售價>0$</售價>
    </>
</書架>

Schema約束

他的出現克服了DTD的侷限性,Schema文件自身就是一個XML文件,但它的擴展名通常爲.xsd

XML Schema VS DTD:

  • Schema符合XML語法結構
  • DOM、SAX等XML API很容易解析出XML Schema文檔中的內容
  • Schemanamespace支持的很好
  • Schema比DTD支持更多的數據類型,並支持用戶自定義新的數據類型
  • Schema定義約束的能力非常搶答,可以對XML實例文檔做出細緻的語義限制
  • Schema不能像DTD一樣定義實體,比DTD更復雜,但Schema正在逐步替代DTD,在安卓中,清單文件和佈局文件用到了Schema技術

Schema約束文檔示例

這是Schema約束文檔

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.lesileqin.com/book" 
	xmlns:tns="http://www.lesileqin.com/book" 
	elementFormDefault="qualified">
	<xs:element name="書架">
		<xs:complexType>
			<xs:sequence maxOccurs='unbounded'>
				<xs:element name="">
					<xs:complexType>
						<xs:sequence>
							<xs:element name='書名' type='xs:string'/>
							<xs:element name='作者' type='xs:string'/>
							<xs:element name='售價' type='xs:string'/>
						</xs:sequence>
					</xs:complexType>	
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

這是對應的xml文件,下面這個xml文件應該完全符合上述schema的標準

<?xml version="1.0" encoding="UTF-8"?>
<tns:書架 xmlns:tns="http://www.lesileqin.com/book" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.lesileqin.com/book book.xsd ">
  <tns:>
    <tns:書名>tns:書名</tns:書名>
    <tns:作者>tns:作者</tns:作者>
    <tns:售價>tns:售價</tns:售價>
  </tns:>
</tns:書架>

Schema教程

請參考這個鏈接:點我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章