1. 程式人生 > >XML DTD和XML Schema

XML DTD和XML Schema

每天都在用xml, 可是卻一直沒有去深入瞭解一下DTD和Schama, 當然我覺得很大一個原因是因為不需要, 本人從事web開發3年多也只有一次修改DTD檔案的機會. 週末無意間翻看了一下張孝祥的書, 再到w3school上讀了兩邊, 總算略知一二, 關鍵點記錄下來, 以為紀念.

簡單的說, DTD和Schema都是用來描述xml文件結構,限定文件的資料型別的. 只是做法上不一樣. 想象一下一個xml 文件無非就是元素的集合, 元素可巢狀, 元素可以有屬性. 那麼DTD或schema就是用來描述一個xml文件可以出現哪些元素, 每個元素都可以有什麼屬性, 每個元素都可以有哪些巢狀元素, 元素可去什麼資料型別, 以及元素的順序, 重複的次數等等. 下面分別記錄DTD和Schema的要點.

DTD:

1 DTD可以嵌入在XML文件中. 如下面的例子:


2 DTD也可以獨立的放在一個檔案中. 如servlet2.3的部署描述檔案xml, dtd檔案引用了一個網路資原始檔:

當然DTD檔案也可以放在本地, 需要注意的是兩者DOCTYPE的宣告的不同:

3 一個XML文件由以下模組構成:

元素 即一個節點 屬性 提供有關元素的額外資訊 實體 預定義的普通文字變數 PCDATA  會被解析器解析的文字, 這些文字將被解析器檢查實體以及標記 CDATA 是不會被解析器解析的文字

則DTD分別用ELEMENT, ATTLIST, ENTITY, #PCDATA, #CDATA來描述.

4 關於ELEMENT:

<!ELEMENT 元素名稱 EMPTY> 描述空元素(沒有子節點和屬性的元素), 如<!ELEMENT br EMPTY>.

<!ELEMENT 元素名稱 (#PCDATA)> 描述只有PCDATA的元素, 如前面提到的<!ELEMENT from (#PCDATA)>.

<!ELEMENT 元素名稱 ANY> 描述可包含任何可解析資料的組合. 不常用.

<!ELEMENT 元素名稱 (子元素名稱 1,子元素名稱 2,.....)> 描述元素包含的子元素序列.

如:<!ELEMENT note (to,from,heading,body)>.

當然可以限定元素出現的次數.如web-app_2_3.dtd:

<!ELEMENT web-app (icon?, display-name?, description?, distributable?,context-param*, filter*, filter-mapping*, istener*, servlet*,servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,login-config?, security-role*, env-entry*, ejb-ref*,  ejb-local-ref*)>

也可以描述"或"關係:<!ELEMENT note (to,from,header,(message|body))> 即"note" 元素必須包含 "to" 元素、"from" 元素、"header" 元素,但 "message" 元素和 "body" 元素只能出現一個.

5 關於ATTLIST:

<!ATTLIST 元素名稱 屬性名稱 屬性型別 預設值> 宣告元素擁有的屬性.

<payment type="check" />對應的DTD描述: <!ATTLIST payment type CDATA "check">.

以下是屬性型別的選項:

型別描述
CDATA 值為字元資料 (character data)
(en1|en2|..) 此值是列舉列表中的一個值
ID 值為唯一的 id
IDREF 值為另外一個元素的 id
IDREFS 值為其他 id 的列表
NMTOKEN 值為合法的 XML 名稱
NMTOKENS 值為合法的 XML 名稱的列表
ENTITY 值是一個實體
ENTITIES 值是一個實體列表
NOTATION 此值是符號的名稱
xml: 值是一個預定義的 XML 值

預設值引數可使用下列值:

解釋
屬性的預設值
#REQUIRED 屬性值是必需的
#IMPLIED 屬性不是必需的
#FIXED value 屬性值是固定的

如:<!ATTLIST contact fax CDATA #IMPLIED>, 則<contact fax="555-667788" />是合法的.

屬性值可列舉:

<!ATTLIST 元素名稱 屬性名稱 (en1|en2|..) 預設值>, 如:

<!ATTLIST payment type (check|cash) "cash">

6 關於實體

<!ENTITY 實體名稱 "實體的值">, 如:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

則在xml中可以這樣引用它們:

<author>&writer;&copyright;</author>

預定義的實體:

實體引用字元
&lt; <
&gt; >
&amp; &
&quot; "
&apos; '

下面是一個電視臺的schedule和對應的DTD:

  

Schema:

Schema是DTD的替代者, 它比DTD可以做更多的事情:

定義可出現在文件中的元素 定義可出現在文件中的屬性 定義哪個元素是子元素 定義子元素的次序 定義子元素的數目 定義元素是否為空,或者是否可包含文字 定義元素和屬性的資料型別 定義元素和屬性的預設值以及固定值

但是代價就是Schema比DTD更復雜.

XML Schema的引用:

note.xsd:

 

由上面的程式碼可見, schema檔案也是一個xml.

Schema名稱空間:

schema有一個非常重要的概念就是名稱空間(namespace).比如在spring中使用宣告式事務管理的時候, 可以採用如下的配置方式為service層配置事務代理:

那麼這裡使用了tx,aop名稱空間.一個xml文件可以使用多個名稱空間, 名稱空間需要先宣告, 並給它取別名, 然後依次給出每個名稱空間的schema檔案地址.如下程式碼解釋希望可以幫助你理解上面臭長的名稱空間宣告:

需要注意的是xsi名稱空間幾乎是必要的, 因為需要用xsi:schemaLocation來申明每個名稱空間的schema檔案地址.

對於上面給出的note.xsd. 因為它本身也是一個xml, 它要使用schema名稱空間, 所以它也要申明名稱空間.

相關推薦

XML DTDXML Schema

每天都在用xml, 可是卻一直沒有去深入瞭解一下DTD和Schama, 當然我覺得很大一個原因是因為不需要, 本人從事web開發3年多也只有一次修改DTD檔案的機會. 週末無意間翻看了一下張孝祥的書, 再到w3school上讀了兩邊, 總算略知一二, 關鍵點記錄下來, 以為紀

Xml-DTDSchema

定義:XML是一種資料傳輸和儲存格式,用標籤儲存資料內容,利用標籤巢狀關係儲存資料之間關係 應用場景:不同平臺間資料傳輸、程式配置檔案 存在形式:XML檔案、也存在記憶體或網路中,不要把XML狹隘理

【黑馬Android】(16)XML/DTD/Sax解析/Schema語法簡介

Xml 概述     Java,跨平臺的開發語言。     Xml,跨平臺的傳輸資料。 Xml語法 標籤語言,類似html。 Xml亂碼問題。 1.文件宣告     用來宣告xml的基本屬性,用來指揮解析引擎如何去解析當前xml     通常一個xml都要包含並且只能包

XML字串XML DOCUMENT的相互轉換總結

轉載自: 只是為了查詢方面 在做一般的XML資料交換過程中,我更樂意傳遞XML字串,而不是格式化的XML Document。這就涉及到XML字串和Xml Document的轉換問題,這是個很簡單的問題。一、使用最原始的javax.xml.parsers,標準的jdk a

js 解析xml檔案xml字串

js解析xml檔案 <script type='text/javascript'> loadXML = function(xmlFile){ var xmlDoc=null; //判斷瀏覽器的型別 //支

JAVA中使用springBootEhcache3.X無xml配置xml配置

我用的是springBoot和Ehcache3.31.在maven的pom.xml匯入ehcache3.3.0依賴<!-- Ehcache 快取--> <dependency> <groupId>org.ehcache</gr

xml中的DTDschema

stun 轉義 是否 xml語法 target san int log 概述 XML的文檔聲明<?xml version="1.0" encoding="UTF-8" ?> xml轉義字符 <![CDATA[內容]]> 實例: <![CDAT

eclipse添加dtd約束xml約束的方法

bean str ima bsp xml約束 cli 命名 src 位置 struts-2.3.dtd dtd 文件的位置 導入上面的 dtd 約束 spring-beans-4.2.xsd 為主配

xml編寫中的DTD約束與schema約束中的語法

DTD語法                        &nbs

Eclipse中web.xml出現No grammar constraints (DTD or XML Schema) referenced in the document 警告

警告提示:No grammar constraints (DTD or XML Schema) referenced in the document. 在  <?xml version="1.0" encoding="UTF-8"?>  下面新增  &l

xml(可擴充套件標記語言)dtdxml約束,文件型別定義)schema(功能比dtd更強大,用以定義xml檔案。字尾名為xsd檔案)

xml:要理解什麼是xml檔案,和html(超文字標記語言)做比較,就很清晰了。      html:是一種可在瀏覽器中顯示的檔案,主要功能是將裡面的文字內容靜態的展示出來,用於顯示資料。                  html使用的標籤html語言規定好的,每個

如何解決XML檔案中的警告提示“No grammar constraints (DTD or XML Schema) referenced in the document.”

方法一:常用方法   關閉XML驗證 工具欄:windows => preferences => xml => xml files => validation => Indicate when no grammar is specifi

Java 模擬servlet執行、DTD約束、Schema約束、dom4j解析(讀寫xml

模擬servlet執行 瀏覽器請求WEB伺服器上的資源,WEB伺服器返回給瀏覽器   瀏覽器的入口不同(訪問路徑),訪問的資源也不同。 我們需要使用xml約束(DTD或schema);為了獲得xml的內容,我們需要使用dom4j進行解析。   XML(不同路徑(/hello)執

為Eclipse新增XML文件所使用的DTDXML Schemaxml編輯提示)

  (1)    DTD         1)    定位到:             WIndow->Preferences->MyEclipse->XML->XML Catalog             2)    在右邊的介面中,選擇"Us

不認識spring xml配置檔案dtdxsd型別,血與淚的教訓啊

今天在初次使用spring原始碼的時候,在spring4.2中使用了xsd型別的配置檔案,導致一直解析配置檔案出錯: 找不到元素 'beans' 的宣告 後來從原始碼工程的test/sources目錄中copy新的dtd格式,該巴改巴就成功了。真是汗啊(⊙﹏⊙)b 記住了,

schemadtdxml之間的關係

xml檔案支援任何使用者自定義元素,schema(即.xsd檔案,xml schema document)和dtd(即.dtd檔案,Document Type Definition)都是對xml檔案的進一步約束,就是說某xml檔案(如web.xml)引入了某個.xsd或者.

解決No grammar constraints (DTD or XML Schema) referenced

No grammar constraints (DTD or XML Schema) referenced in the document. <?xml version="1.0" encoding="UTF-8" standalone="no"?> <

JAVA Web開發之XML基礎DTD約束

語法格式:    <!ENTITY % 實體名稱 "實體內容" > 引用方式: %實體名稱; 舉例1:   <!ENTITY % TAG_NAMES "姓名 | EMAIL | 電話 | 地址">       <!ELEMENT 個人資訊 (%TAG_NAMES; | 生日)&g

在Eclipse中匯入dtdxsd檔案,使XML自動提示

DTD 型別約束檔案     1. Window->Preferences->XML->XML Catalog->User Specified Entries視窗中,選擇Add 按紐     2.在Add XML Catalog Entry 對話方塊中選擇或輸入以下內容:       

No grammar constraints (DTD or XML Schema) referenced in the document.

class doctype app ati lns cati nts htm 解決 問題描述 web.xml 使用 Servlet4.0 版本,No grammar constraints (DTD or XML Schema) referenced in the docu