溫馨提示×

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

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

XML DTD于XML Schema的示例分析

發(fā)布時(shí)間:2021-07-27 11:07:15 來(lái)源:億速云 閱讀:160 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了XML DTD于XML Schema的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

XML(eXtensible Markup Language)可擴(kuò)展的標(biāo)記語(yǔ)言。xml在web service編程中尤為重要。在網(wǎng)絡(luò)傳輸中可以作為傳輸數(shù)據(jù)的載體。xml作為元語(yǔ)言,它可以用來(lái)標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類(lèi)型,是一種允許用戶對(duì)自己的標(biāo)記語(yǔ)言進(jìn)行定義的元語(yǔ)言。 它非常適合網(wǎng)絡(luò)傳輸,提供統(tǒng)一的方法來(lái)描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。可以實(shí)現(xiàn)異構(gòu)語(yǔ)言、異構(gòu)平臺(tái)之間的交互。XML 文檔定義方式有:文檔類(lèi)型定義(DTD)和XML Schema。DTD(Document Type Definition)定義了文檔的整體結(jié)構(gòu)以及文檔的語(yǔ)法(下面會(huì)有相應(yīng)的例子用于理解)應(yīng)用廣泛并有豐富的工具支持。XML Schema的功能更強(qiáng)大,用于定義管理信息等更強(qiáng)大、更豐富的特征。XML能夠更細(xì)粒度地聲明內(nèi)容,定義約束,方便跨越多種平臺(tái)的更有意義的傳輸內(nèi)容。它提供了一種描述結(jié)構(gòu)數(shù)據(jù)的格式,簡(jiǎn)化了網(wǎng)絡(luò)中數(shù)據(jù)交換和表示,使得代碼、數(shù)據(jù)和表示分離,并作為數(shù)據(jù)交換的標(biāo)準(zhǔn)格式,因此它常被稱(chēng)為智能數(shù)據(jù)文檔。可以把DTD比作鐵鏟,而XML Schema就可以說(shuō)是挖掘機(jī),功能更強(qiáng)大?! ML雖然稱(chēng)作標(biāo)記語(yǔ)言,但與HTML(超文本標(biāo)記語(yǔ)言)不同,它的格式更嚴(yán)格,標(biāo)簽必須封閉,顯示與內(nèi)容分離,XML描述的是文檔的內(nèi)容與語(yǔ)義而不是文檔該如何顯示。HTML有固定的標(biāo)簽,顯示跟內(nèi)容是一起的,不能創(chuàng)建自己的標(biāo)簽,而XML是可擴(kuò)展的,內(nèi)容與顯示分離,每個(gè)元素都成對(duì)出現(xiàn),又開(kāi)始就有結(jié)束,而且XML元素的嵌套關(guān)系要保持正確(嵌套中后開(kāi)始的標(biāo)記要先結(jié)束,先開(kāi)始的標(biāo)記要后結(jié)束),每一個(gè)XML文檔中只有一個(gè)根元素(Root Element),根元素包含了其他所有的元素。符合XML語(yǔ)法的XML文檔在未被DTD或XML Schema驗(yàn)證時(shí)叫做良構(gòu)(well form)的,如果良構(gòu)的xml文檔被DTD或XML Schema驗(yàn)證,這種xml文檔稱(chēng)為有效(Valid)的。

下面以一個(gè)學(xué)生名冊(cè)的xml作為例子

<?xml version="1.0" encoding="utf-8"?>
<學(xué)生名冊(cè)>
    <學(xué)生 學(xué)號(hào)="A1">
        <姓名>CIACs</姓名>
        <性別>男</性別>
        <年齡>22</年齡>
    </學(xué)生>

    <學(xué)生 學(xué)號(hào)="A2">
        <姓名>zhihao</姓名>
        <性別>男</性別>
        <年齡>23</年齡>
    </學(xué)生>
</學(xué)生名冊(cè)>

格式良好的xml文檔,XMLSpy的輸出窗口會(huì)輸出如下結(jié)果

XML DTD于XML Schema的示例分析

xml的首行一定要是<?xml version="1.0"?>處理指令,且”<?xml”之間不能有空白,xml元素嚴(yán)格區(qū)分大小寫(xiě),文檔編碼格式默認(rèn)為“UTF-8”,版本只有1.0。上面的xml文檔只能說(shuō)是格式良好的xml文檔,不能說(shuō)是有效的(Vaild)xml文檔。下面我們用兩種方式去驗(yàn)證它。

首先是通過(guò)DTD來(lái)對(duì)它進(jìn)行驗(yàn)證

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 學(xué)生名冊(cè) [
<!ELEMENT 學(xué)生名冊(cè) (學(xué)生+)>
<!ELEMENT 學(xué)生 (名字,性別,年齡)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 性別 (#PCDATA)>
<!ELEMENT 年齡 (#PCDATA)>
<!ATTLIST 學(xué)生 學(xué)號(hào) ID #REQUIRED>
<!ENTITY  sex "男">
]>

<學(xué)生名冊(cè)>
    <學(xué)生 學(xué)號(hào)="A1">
        <名字>CIACs</名字>
        <性別>&sex;</性別>
        <年齡>22</年齡>
    </學(xué)生>
    
    <學(xué)生 學(xué)號(hào)="A2">
        <名字>zhihao</名字>
        <性別>&sex;</性別>
        <年齡>23</年齡>
    </學(xué)生>
</學(xué)生名冊(cè)>

如果驗(yàn)證通過(guò)的話,XMLSpy輸出窗口會(huì)有如下的結(jié)果顯示

XML DTD于XML Schema的示例分析

否則就算是多了一個(gè)空格都不會(huì)通過(guò)驗(yàn)證。這里我把dtd的驗(yàn)證寫(xiě)到了xml中,當(dāng)然你也可以把它寫(xiě)到另一個(gè)文件中,該文件的后綴名為“.dtd”,然后把它關(guān)聯(lián)到要驗(yàn)證的xml文檔中,語(yǔ)法如下

1 <!DOCTYPE 根元素名 SYSTEM "*.dtd">

此處ID值好像要以字符開(kāi)頭,如果只是數(shù)字通不過(guò)驗(yàn)證。

學(xué)生信息中的性別,我把它定義為實(shí)體,然后通過(guò)實(shí)體引用它的值,要注意實(shí)體引用的語(yǔ)法是"&實(shí)體名;"。

下面通過(guò)XML Schema方式來(lái)驗(yàn)證

要驗(yàn)證的xml文檔

<?xml version="1.0" encoding="utf-8"?>
<學(xué)生名冊(cè) xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="學(xué)生名冊(cè).xsd">
    <學(xué)生 學(xué)號(hào)="A1">
        <姓名>CIACs</姓名>
        <性別>男</性別>
        <年齡>22</年齡>
    </學(xué)生>

    <學(xué)生 學(xué)號(hào)="A2">
        <姓名>zhihao</姓名>
        <性別>男</性別>
        <年齡>23</年齡>
    </學(xué)生>
</學(xué)生名冊(cè)>

XML Schema驗(yàn)證文檔

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="學(xué)生名冊(cè)">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="unbounded">
                <xs:element ref="學(xué)生"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="學(xué)生">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="姓名" type="xs:string"/>
                <xs:element name="性別">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="男"/>
                            <xs:enumeration value="女"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element name="年齡">
                    <xs:simpleType>
                        <xs:restriction base="xs:integer">
                            <xs:minExclusive value="0"/>
                            <xs:maxExclusive value="120"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="學(xué)號(hào)" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

XMLSpy輸出窗口的輸出結(jié)果

XML DTD于XML Schema的示例分析

要驗(yàn)證的xml的文檔通過(guò)在根元素開(kāi)始標(biāo)簽中加入下面的信息關(guān)聯(lián)XML Schema文檔

 1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="學(xué)生名冊(cè).xsd"

以上的文檔都是放在同一路徑下的,所以直接引用文件名就行了。

從上面的兩種驗(yàn)證方式我們可以很清楚的看出DTD跟XML Schema驗(yàn)證的區(qū)別,兩者同樣是進(jìn)行xml文檔驗(yàn)證的,XML Schema提供了比DTD更為強(qiáng)大的功能和更細(xì)粒度的數(shù)據(jù)類(lèi)型,而且Schema還可以自定義數(shù)據(jù)類(lèi)型,其本身就是xml文件,但dtd的語(yǔ)法跟xml的語(yǔ)法不同。雖然從代碼量來(lái)看Schema大于dtd,但是當(dāng)你學(xué)過(guò)Schema后你就會(huì)更喜歡用Schema。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“XML DTD于XML Schema的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(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