1. 程式人生 > 實用技巧 >DTD和Schema約束

DTD和Schema約束

一、DTD

1、什麼是DTD

DTD (Document Type Definition ),文件型別定義,用來約束XML文件。規定XML文件中元素的名稱,子元素的名稱及順序,元素的屬性等。

2、DTD重點要求

開發中,我們很少自己編寫DTD約束文件,通常情況我們都是通過框架提供的DTD約束文件,編寫對應的XML文件。常見框架使用DTD約束有:struts2, hibernate等。

通過提供的DTD"web-app_2_3.dtd "編寫XML

<?xml version="1.0" encoding="UTF-8"?>
<!--
	模擬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>

3、DTD語法

1)內部DTD,在XML文件內部嵌入DTD,只對當前XML有效。

<?xml version="1.0" encoding="UTF-8"? standalone="yes" ?>

<!DOCTYPE web-app [

...//具體語法

]>

<web-app>

</web-app>

2.)外部DTD——本地DTDDTD文件在本地系統上,公司內部自己專案使用。

3.)外部DTD——公共DTDDTD文件在網路上,一般都有框架提供。

4、元素宣告

定義元素語法

:<!ELEMENT元素名 元素描述>

元素名:自定義

元素描述包括 : 符號和資料型別

常見符號: ? * + () | ,

常見型別:#PCDATA表示內容是文字,不能是子標籤

符號

符號型別

描述

示例

?

問號

表示該物件可以出現,但只能出現一次

(菜鳥?

*

星號

表示該物件允許出現任意多次,也可以是零次

(愛好*)

+

加號

表示該物件最少出現一次,可以出現多次

(成員+)

()

括號

用來給元素分組

(古龍|金庸|梁羽生),

(王朔|餘傑),毛毛

|

豎條

表明在列出的物件中選擇一個

(男人|女人)

,

逗號

表示物件必須按指定的順序出現

(西瓜,蘋果,香蕉)

  

<!ELEMENT  web-app(servlet*,servlet-mapping*,welcome-file-list?)>
    web-app包括3個標籤,且必須順序出現。
        servlet子標籤個數任意
        servlet-mapping子標籤個數任意
        welcome-file-list子標籤最多隻能出現一次
<!ELEMENT servlet(servlet-name,description?,(servlet-class|jsp-file))>
    servlet有3個子標籤,且必須順序出現
        servlet-name,必須有,且只能出現1次
        description,可選1次
        servlet-class和jsp-file二選一,且只能出現一次
<!ELEMENT servlet-name(#PCDATA)>
    servlet-name的標籤體必須是文字
<!ELEMENT  welcome-file-list  (welcome-file+)>
      welcome-file-list至少有1個子標籤welcome-file

5、屬性宣告

二、Schema約束

1、什麼是Schema

Schema是新的XML文件約束:

Schema要比DTD強大很多,是DTD替代者;

Schema本身也是XML文件,但Schema文件的副檔名為xsd,而不是xml .

Schema功能更強大,資料型別更完善

Schema支援名稱空間

2、Schema重點要求

DTD一樣,要求可以通過schema約束文件編寫xml文件。常見框架使用schema的有:Spring等通過提供”web-app_ 2_ 5.xsd"編寫xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    模擬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">
-->
<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>