DTD驗證xml格式的三種方式詳解
驗證xml格式
目前有兩種為XML文檔定義語義約束的方式:一種是采用DTD作為語義約束;一種是采用 XML Schema作為語義約束
DTD驗證
可以使用DTD來定義XML文檔的合法構(gòu)建模塊。DTD可以寫在文檔內(nèi)部,也可以另外寫一個文件
DTD約束簡單易用,但是功能較弱
在XML文檔中引入DTD主要有三種方式
- 內(nèi)部DTD
- 外部DTD
- 公用DTD
內(nèi)部DTD
內(nèi)部DTD就是將DTD與XML數(shù)據(jù)定義放在同一份文檔中
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>ll</to> <from>zh</from> <body>hello</body> </note>
DTD包含在以上格式的聲明中
<!DOCTYPE 根元素 [元素聲明]> XML文檔主體部分
外部DTD
如果DTD位于XML源文件外部,應(yīng)該封裝在一個DTD文檔中,并在XML中聲明,方便被多個XML文檔共享
<!DOCTYPE 根元素 SYSTEM "外部DTD地址">
公用DTD
有一種特殊的外部DTD,是由某個權(quán)威機構(gòu)制定的,通過PUBLIC關(guān)鍵字引入,使用公用DTD時,還需要給該DTD指定一個標識名
<!DOCTYPE 根元素 PUBLIC "DTD標識名" "公用DTD地址">
DTD結(jié)構(gòu)
元素類型描述
元素聲明的語法格式
<!ELEMENT 元素名稱 元素類型描述>
元素類型描述的格式
PCDATA
關(guān)鍵字#PCDATA說明元素只能是字符串,不能包含其他子元素,也不可以是空元素
例:
<?xml version="1.0"?> <!DOCTYPE name [ <!ELEMENT name (#PCDATA)> ]> <name>張三</name>
子元素
說明元素包含的是子元素。當一個元素只包含子元素時而沒有字符數(shù)據(jù)時,表示此元素類型具有元素型類型。在該類型的元素聲明時,通過內(nèi)容模型來指定在其內(nèi)容上的約束(內(nèi)容模型是決定子元素類型和子元素出現(xiàn)順序的一種簡單語法)
例:
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>ll</to> <from>zh</from> <body>hello</body> </note>
復(fù)雜一些的內(nèi)容模型為
<!-- 豎線| 表示這些至少存在一個 ? 表示可以有一個也可以沒有 * 表示零個或者多個 + 表示一個或者多個,至少有一個 --> <!-- 該內(nèi)容模型表示 簡歷中要有名字,性別,年齡,電話和手機任選一個,填寫一個家庭住址或者不填,零個或者多個興趣愛好,至少一個教育經(jīng)歷,工作經(jīng)驗可有可無 --> <!ELEMENT 簡歷 (名字,性別,年齡,(電話 | 手機), 家庭住址?, 興趣愛好*, 教育經(jīng)歷+, 工作經(jīng)驗*)>
混合內(nèi)容
既可以包含子元素,也可以包含字符數(shù)據(jù)(使用混合內(nèi)容模型時,#PCDATA關(guān)鍵字必須是模型中的第一個選項,不能在模型中使用逗號、問號或加號。只能用豎線來分隔#PCDATA和元素)
<?xml version="1.0"?> <!DOCTYPE email [ <!ELEMENT email (#PCDATA | body)*> <!ELEMENT body (#PCDATA)> ]> <email> 郵件 <body>hello</body> </email>
EMPTY
關(guān)鍵字EMPTY表明該元素只能是一個空元素,既不包含字符串,也不包含子元素
例:
<!ELEMENT br EMPTY>
ANY
關(guān)鍵字ANY表明該元素可以包含任何字符數(shù)據(jù)和子元素
<!ELEMENT note ANY>
元素屬性定義
屬性定義的格式
<!ATTLIST 屬性所屬的元素 屬性名 屬性類型 [元素對屬性的約束] [默認值]>
元素對屬性的約束類型
REQUIRED 必需的屬性,不能指定默認值
IMPLIED 可有可無,不能指定默認值
FIXED 固定的屬性值,必須指定默認值
沒有約束時,必須為屬性指定默認值
屬性類型
- CDATA 字符串類型
(en1|en2|en3) 一系列枚舉
<!ATTLIST file type (txt|csv|json) #REQUIRED>
- ID 有效地標識符,可用于標識該元素,在xml文檔中必須唯一
- IDREF 引用自另一個已有的ID屬性值
- IDREFS 引用自多個已有的ID屬性值,多個ID屬性值之間用空格隔開
- NMTOKEN 一個合法的XML名稱,指定了該屬性值是字符串,但比CDATA有更強的約束性,表明該屬性只能由字母、數(shù)字、英文下劃線、英文橫杠、英文點號、英文冒號組成
- NMTOKENS 由多個NMTOKEN組成,多個NMTOKEN用空格隔開
- ENTITY 是一個外部實體
- ENTITIES 多個外部實體,之間使用空格隔開
- NOTATION 該屬性值是在DTD中聲明過的符號,該規(guī)范已過期
- xml: 該屬性值是一個預(yù)定義的xml值
示例
<?xml version="1.0"?> <!DOCTYPE email [ <!ELEMENT email (#PCDATA | body)*> <!ATTLIST email from CDATA #REQUIRED> <!ATTLIST email to CDATA #REQUIRED> <!ELEMENT body (#PCDATA)> ]> <email from="zh" to="ll"> 郵件 <body>hello</body> </email>
XML Schema Definition
在DTD之后,W3C推出了新的規(guī)范來驗證xml格式:XML Schema Definition
XML Schema 約束采用了XML文檔定義,支持更詳細的約束規(guī)則,功能強大,只是使用起來比較復(fù)雜
Schema語法格式
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http:///j2j.idril.cn" xmlns="http://j2j.idril.cn" elementFormDefault="qualified"> <xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
<xs:schema // 指定了schema中用到的元素和數(shù)據(jù)類型來自的命名空間 還規(guī)定了來自此命名空間的元素和數(shù)據(jù)類型應(yīng)該使用前綴xs: xmlns:xs="http://www.w3.org/2001/XMLSchema" // 說明此schema定義的元素來自的命名空間 targetNamespace="http:///j2j.idril.cn" // 指定了默認的命名空間,使用該命名空間下的Schema組件時,不需要使用任何前綴來作為限定 xmlns="http://j2j.idril.cn" // 指出任何XML實例文檔所使用的且在此schema中聲明過的元素必須被命名空間限定 elementFormDefault="qualified">
Schema數(shù)據(jù)類型
Schema提供了強大的數(shù)據(jù)類型支持
簡單類型 既能作為XML元素的類型,也可作為XML屬性的類型
分為兩大類
- 內(nèi)建類型 可以直接拿來定義元素或?qū)傩缘臄?shù)據(jù)類型
自定義類型 自定義類型是由內(nèi)件類型派生出來的,派生方式有3種
- 限制 使用<restriction...>元素為原有類型增加一個或多個額外的約束
- 列表 使用<list…>元素定義
- 聯(lián)合 使用<union…>元素定義
- 復(fù)雜類型 只能作為XML元素的類型
簡單類型
string、normalizedString、token、base64Binary、hexBinary、integer、positiveInteger、negativeInteger、nonNegativeInteger、nonPositiveInteger、long、unsignedLong、int、unsignedInt、short、unsignedShort、byte、unSignedByte、decimal、float、double、boolean、duration、dateTime、date、time、gYear、gYearMonth、gMonth、gMonthDay、gDay、Name、QName、NCName、anyURI、language、ID、IDREF、IDREFS、ENTITY、ENTITIES、NOTATION、NMTOKEN、NMTOKENS
以字符串及相關(guān)類型為例
- string 原封不動的保留字符串內(nèi)容前面、后面及中間的所有空白
- normalizedString 會將字符串內(nèi)容中包含的換行、制表符、回車符都替換為空白
- token 會將字符串內(nèi)容中包含的換行、制表符、回車符都替換為空白,并自動刪除字符串前后的空白,如果字符串中間包含有多個連續(xù)的空白,多個連續(xù)的空白會被壓縮為單個空白
// 簡易元素(僅包含文本的元素,不會包含子元素或?qū)傩? // 常用的type有xs:strig、xs:decimal、xs:integer、xs:Boolean、xs:date、xs:time <xs:element name="to" type="xs:string"/>
// 屬性 // 常用的type有xs:strig、xs:decimal、xs:integer、xs:Boolean、xs:date、xs:time <xs:attribute name="lang" type="xs:string"/>
自定義限制類型
共有12中約束
- enumeration 指定元素或?qū)傩缘闹凳敲杜e值
- fractionDigits 對于任意精度的十進制數(shù)起作用,用于定義小數(shù)點后的最大位數(shù)
- length 定義元素或?qū)傩缘闹档淖址L度
- minExclusive 定義元素或?qū)傩缘南陆缰?,必須大于該?/li>
- maxExclusive 定義元素或?qū)傩缘纳辖缰?,必須小于該?/li>
- minInclusive 定義元素或?qū)傩缘南陆缰担仨毚笥诘扔谠撝?/li>
- maxInclusive 定義元素或?qū)傩缘纳辖缰?,必須小于等于該?/li>
- minLength 字符串的最小長度
- maxLength 字符串的最大長度
- pattern 數(shù)據(jù)類型的值必須匹配的指定的正則表達式
- totalDigits 指定decimal及其派生類型的數(shù)值最大能有幾位數(shù)(包括小數(shù)和整數(shù)部分)
whiteSpace 對字符串中的空白處理方式,取值為
- preserve 保留字符串中的空白
- replace 將所有的制表符、換行符和回車符都用空格代替
- collapse 先執(zhí)行replace,然后取出首尾的空格,并將中間多個相鄰的空格壓縮為一個空格
<!-- 定義一個新的數(shù)據(jù)類型 --> <xs:simpleType name="age_Type"> <!-- 限定 用于XML元素或者屬性定義可接受的值 --> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"> <xs:maxInclusive value="120"> </xs:restriction> </xs:simpleType> <!-- 使用自定義類型 --> <xs:element name="age" type="age_Type"></xs:element>
自定義列表類型
有兩種方式可以來自定義列表類型
- 在<list…>元素中增加<simpleType…>子元素來指定列表元素的數(shù)據(jù)類型
<xs:simpleType name="age_list_Type"> <xs:list> <!-- 定義一個新的數(shù)據(jù)類型 --> <xs:simpleType name="age_Type"> <!-- 限定 用于XML元素或者屬性定義可接受的值 --> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"> <xs:maxInclusive value="120"> </xs:restriction> </xs:simpleType> </xs:list> </xs:simpleType>
為<list…>元素的itemType屬性指定列表元素的數(shù)據(jù)類型
<!-- 定義一個新的數(shù)據(jù)類型 --> <xs:simpleType name="age_Type"> <!-- 限定 用于XML元素或者屬性定義可接受的值 --> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"> <xs:maxInclusive value="120"> </xs:restriction> </xs:simpleType> <xs:simpleType name="age_list_Type"> <xs:list itemType="age_Type"></xs:list> </xs:simpleType>
自定義聯(lián)合類型
有兩種方式可以自定義聯(lián)合類型
在<union…>元素中增加一或多個<simpleType…>子元素來指定聯(lián)合元素的數(shù)據(jù)類型
<xs:simpleType name="price_publish_Type"> <xs:union> <!-- 定義一個新的數(shù)據(jù)類型 --> <xs:simpleType> <!-- 限定 用于XML元素或者屬性定義可接受的值 --> <xs:restriction base="xs:decimal"> <xs:minInclusive value="0"> <xs:maxInclusive value="120"> </xs:restriction> </xs:simpleType> <!-- 定義一個新的數(shù)據(jù)類型 --> <xs:simpleType> <!-- 限定 用于XML元素或者屬性定義可接受的值 --> <xs:restriction base="xs:date"> <xs:minInclusive value="2022-01-01"> <xs:maxInclusive value="2022-12-31"> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType>
- 在<union…>元素的memberTypes屬性指定一或多個簡單類型,多個簡單類型只愛你使用空格隔開
<!-- 定義一個新的數(shù)據(jù)類型 --> <xs:simpleType name="price_Type"> <!-- 限定 用于XML元素或者屬性定義可接受的值 --> <xs:restriction base="xs:decimal"> <xs:minInclusive value="0"> <xs:maxInclusive value="120"> </xs:restriction> </xs:simpleType> <!-- 定義一個新的數(shù)據(jù)類型 --> <xs:simpleType name="publish_date_Type"> <!-- 限定 用于XML元素或者屬性定義可接受的值 --> <xs:restriction base="xs:date"> <xs:minInclusive value="2022-01-01"> <xs:maxInclusive value="2022-12-31"> </xs:restriction> </xs:simpleType> <xs:simpleType name="price_publish_Type"> <xs:union memberTypes="price_Type publish_date_Type"> </xs:union> </xs:simpleType>
復(fù)雜類型
定義復(fù)雜類型使用complexType元素,有兩種方式
- 定義全局命名復(fù)雜類型:將<complexType…>元素作為<schema…>、<redefine…>元素的子元素使用,需要指定name屬性,其值就是該復(fù)雜類型的類型名
- 定義局部匿名復(fù)雜類型:將<complexType…>元素作為<element…>元素的子元素使用,無須指定name屬性,僅用于指定其父元素<element…>所定義的元素的類型
// 復(fù)合元素 <xs:element name="email"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
<xs:element name="to" type="xs:string"/>
Schema的使用
同樣的,在xml中需要聲明Schema
<?xml version="1.0"?> <note xmlns="http://j2j.idril.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://j2j.idril.cn node.xsd"> <to>ll</to> <from>zh</from> <body>hello</body> </note>
// 規(guī)定了默認的命名空間的聲明 xmlns="http://j2j.idril.cn" // 定義了XML Schema實例命名空間 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" // 包含兩個值 第一個值是需要使用的命名空間 第二個值是供命名空間使用的XML Schema的位置 xsi:schemaLocation="http://j2j.idril.cn node.xsd"
以上就是DTD驗證xml格式的三種方式詳解的詳細內(nèi)容,更多關(guān)于DTD驗證xml格式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java類加載器與雙親委派機制和線程上下文類加載器專項解讀分析
類加載器負責(zé)讀取Java字節(jié)代碼,并轉(zhuǎn)換成java.lang.Class類的一個實例的代碼模塊。本文主要和大家聊聊JVM類加載器ClassLoader的使用,需要的可以了解一下2022-12-12java編程SpringSecurity入門原理及應(yīng)用簡介
Spring 是非常流行和成功的 Java 應(yīng)用開發(fā)框架,Spring Security 正是 Spring 家族中的成員。Spring Security 基于 Spring 框架,提供了一套 Web 應(yīng)用安全性的完整解決方案2021-09-09SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法
本文主要介紹了SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Maven打包SpringBoot工程的實現(xiàn)示例
在使用Spring Boot和Maven的項目中,你可以使用Maven來打包你的項目,本文主要介紹了Maven打包SpringBoot工程的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-05-05