欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

DTD驗證xml格式的三種方式詳解

 更新時間:2023年10月07日 17:34:54   作者:bug生產(chǎn)者  
這篇文章主要介紹了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之int和string類型轉(zhuǎn)換詳解

    Java之int和string類型轉(zhuǎn)換詳解

    這篇文章主要介紹了Java之int和string類型轉(zhuǎn)換詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java類加載器與雙親委派機制和線程上下文類加載器專項解讀分析

    Java類加載器與雙親委派機制和線程上下文類加載器專項解讀分析

    類加載器負責(zé)讀取Java字節(jié)代碼,并轉(zhuǎn)換成java.lang.Class類的一個實例的代碼模塊。本文主要和大家聊聊JVM類加載器ClassLoader的使用,需要的可以了解一下
    2022-12-12
  • java編程SpringSecurity入門原理及應(yīng)用簡介

    java編程SpringSecurity入門原理及應(yīng)用簡介

    Spring 是非常流行和成功的 Java 應(yīng)用開發(fā)框架,Spring Security 正是 Spring 家族中的成員。Spring Security 基于 Spring 框架,提供了一套 Web 應(yīng)用安全性的完整解決方案
    2021-09-09
  • SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法

    SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法

    本文主要介紹了SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 如果你想寫自己的Benchmark框架(推薦)

    如果你想寫自己的Benchmark框架(推薦)

    這篇文章主要介紹了如果你想寫自己的Benchmark框架,本文通過給大家分享八條軍規(guī),幫助大家理解,需要的朋友可以參考下
    2020-07-07
  • Maven打包SpringBoot工程的實現(xiàn)示例

    Maven打包SpringBoot工程的實現(xiàn)示例

    在使用Spring Boot和Maven的項目中,你可以使用Maven來打包你的項目,本文主要介紹了Maven打包SpringBoot工程的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Java Scanner如何獲取字符串和帶空格的字符串

    Java Scanner如何獲取字符串和帶空格的字符串

    這篇文章主要介紹了Java Scanner如何獲取字符串和帶空格的字符串問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java中int和Integer的區(qū)別

    Java中int和Integer的區(qū)別

    這篇文章主要介紹的是?Java中int和Integer的區(qū)別,Java?是一種強數(shù)據(jù)類型的語言,因此所有的屬性必須有一個數(shù)據(jù)類型,下面文章基于Java詳細int和Integer有何區(qū)別,需要的朋友可以參考一下
    2021-11-11
  • Java 如何利用緩沖流讀寫文件

    Java 如何利用緩沖流讀寫文件

    這篇文章主要介紹了Java 如何利用緩沖流讀寫文件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 一文帶你搞懂Spring響應(yīng)式編程

    一文帶你搞懂Spring響應(yīng)式編程

    相信響應(yīng)式編程經(jīng)常會在各種地方被提到。本篇就為大家從函數(shù)式編程一直到Spring?WeFlux做一次簡單的講解,并給出一些示例,希望大家可以更好的理解響應(yīng)式編程
    2022-07-07

最新評論