DTD約束
因爲XML文件的標籤和屬性可以隨意擴展,有時我們必須要限制每個文檔有哪些元素,每個元素有哪些子元素,每個元素有哪些屬性,屬性的值是什麼類型等。
通過XML約束可以保證XML文件中的數據的正確性
<?xml version="1.0" encoding="GBK"?>
<person>
<name>鳳姐</name>
<age>20</age>
</person>
XML的兩種約束
- DTD約束,語法簡單,弱
- SCHEMA,語法複雜,強
DTD約束的概念:
- DTD概念: Document Type Definiation 文檔類型定義
- 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的不足:
- 不能驗證數據類型
- 因爲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>
- 步驟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文件即可。
< + 回車 -> 提示 -> 自動補全