DTD約束、Schema約束

DTD約束

因爲XML文件的標籤和屬性可以隨意擴展,有時我們必須要限制每個文檔有哪些元素,每個元素有哪些子元素,每個元素有哪些屬性,屬性的值是什麼類型等。

通過XML約束可以保證XML文件中的數據的正確性

<?xml version="1.0" encoding="GBK"?>
<person>
	<name>鳳姐</name>
	<age>20</age>
</person>

XML的兩種約束

  1. DTD約束,語法簡單,弱
  2. SCHEMA,語法複雜,強

DTD約束的概念:

  1. DTD概念: Document Type Definiation 文檔類型定義
  2. DTD作用:限制XML只能出現指定的內容
導入DTD文件的兩種格式 說明
<!DOCTYPE** 根元素 SYSTEM “DTD文件”> 本地的約束,適合個人,公司小範圍的使用的約束
<!DOCTYPE** 根元素 PUBLIC “文件描述” “DTD文件”> 網絡上的約束,適合大範圍的使用

如:hibernate框架的導入方式

在這裏插入圖片描述DTD使用案例
步驟1:新建bookshelf.dtd文件,選擇項目鼠標右鍵“NEW->File",文件名爲“bookshelf.dtd”

步驟2:複製下面內容到bookshelf.dtd

<!ELEMENT 書架 (+)>
<!ELEMENT 書 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>

步驟3:新建books.xml,代碼如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 書架 SYSTEM "bookshelf.dtd">
<書架>
    <>
        <書名>JavaEE SSM</書名>
        <作者>張三</作者>
        <售價>30</售價>
    </>
    <>
        <書名>人鬼情喂鳥</書名>
        <作者>李四</作者>
        <售價>300</售價>
    </>
</書架>

步驟4:idea開發工具books.xml的dtd約束驗證不通過的效果
在這裏插入圖片描述

在企業實際開發中,很少自己編寫DTD約束文檔,我們後期只需通過框架提供的DTD約束文檔編寫出相應的XML配置文檔。

Schema約束

爲什麼要有Schema約束

DTD的不足:

  1. 不能驗證數據類型
  2. 因爲DTD是一個文本文件,本身不能驗證是否正確。
  • Schema約束文件擴展名(XML Schema Definition)XML模式定義:xsd

  • 約束文件本身也是XML文件,所以也有根元素,根元素的名字叫:schema

模式文檔:就是Schema約束文檔
實例文檔:就是我們要寫的XML

在這裏插入圖片描述
命名空間
相當於包名

問:如果在Java中如果使用同名的類,如何避免衝突?比如:Date類,在java.util和java.sql包中都有

package com.itheima;
import java.sql.Date;
public class Demo1 {
    public static void main(String[] args) {
        // java.util.Date
        // java.sql.Date

        java.util.Date d1 = new java.util.Date();
        System.out.println(d1);

        java.sql.Date d2 = new java.sql.Date(System.currentTimeMillis());
        System.out.println(d2);
    }
}

如果不同的xsd約束文件出現同名的標籤,如何避免衝突?

一個XML文件可以有多個約束文件,不同的Schema約束文檔中出現相同的內容.給不同的Schema文檔取不同的命名空間,通過命名空間可以區分使用的是哪個Schema裏面的約束

在這裏插入圖片描述

  • targetNamespace用來指定命名空間
  • 默認命名空間,前面不需要指定前綴,直接使用<標籤名>
  • 一個XML文檔中只能有一個默認的命名空間
  • 其它命名空間中的標籤,使用<前綴:標籤名>來引用

Schema演示案例
1.步驟1:新建schema約束文件bookshelf.xsd,複製以下代碼到bookshelf.xsd文件中:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.itcast.cn"
           elementFormDefault="qualified">
    <xs:element name='書架'>
        <xs:complexType>
            <xs:sequence maxOccurs='unbounded'>
                <xs:element name='書'>
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name='書名' type='xs:string'/>
                            <xs:element name='作者' type='xs:string'/>
                            <xs:element name='售價' type='xs:double'/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
  1. 步驟2:新建books2.xml使用schema約束文件

在自己編寫的XML中引入schema約束文件的格式

<根元素 xmlns="命名空間" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="命名空間 xsd約束文件名">
</根元素>

book2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<書架 xmlns="http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd">
    <>
        <書名>JavaEE</書名>
        <作者>張三</作者>
        <售價>39</售價>
    </>
    <>
        <書名>西遊記</書名>
        <作者>吳承恩</作者>
        <售價>3000</售價>
    </>
</書架>

步驟3:違反約束,開發工具提示效果
在這裏插入圖片描述
Schema學習要求

雖然schema功能比dtd強大,但是編寫要比DTD複雜,同樣以後我們在企業開發中也很少會自己編寫schema文件。我們只需要藉助開發工具,在現有的xsd約束下,寫出正確的xml文件即可。

< + 回車 -> 提示 -> 自動補全
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章