1. DTD
先來說 DTD,我們先給聘個例子,以例子為導向進行講解:
這個是一個spring的簡單配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
...
</beans>
不看具體內容,我們先來看一下以前我們不太關注的前兩行。
首先我們要明確一點 xml 文檔本身并不實現任何功能,我們下邊所說的他所表現的東西,都是要給xml解析器看的。
第一行 <?xml version="1.0" encoding="UTF-8"?>
這一行就是說明 此xml文檔的版本為1.0,以及編碼方式為UTF-8
第二行 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
乍一看好像很復雜,完全看不懂,實際上呢這個涉及到 xml 的另一個概念 DTD。這個東西我們后邊再細說,現在你可以先簡單做如下理解:
首先我們要知道, xml里邊的標簽如
<beans> <city> <person> ...
這些都是可以隨意寫的,這樣就會比較混亂,那人們就發明了一個東西叫DTD
的東西來規范我們的標簽,像這個文檔里標簽可以寫成什么樣啊,誰是主標簽,誰是子標簽,誰是屬性,他們的類型是什么 都由DTD
來規定,好,我們暫時理解到這樣就可以了。
好,我們繼續說
<!DOCTYPE
當然就是DTD
的標簽定義了
beans
就是說明當前文檔的根元素是什么,從下邊的內容也能看出來
PUBLIC "-//SPRING/DTD BEAN/EN"
這個是公共標識符定義,xml解析器知道如何尋找匹配此公共標識符的DTD
"http://www.springframework.org/dtd/spring-beans.dtd"
如果 解析器用上邊的公共標識符沒有匹配到DTD,則會用這個URL尋找DTD 的位置。
那DTD的文件到底是什么樣子呢,我們下邊簡單的來了解一下:
DTD 相關
DTD(文檔類型定義)的作用是定義XML文檔的合法構建模塊。
通俗一點說就是定義當前XML文檔里都可以有什么元素,他們的格式是什么。
和以前一樣,我們先來看一例子:
一、第一個例子
<!ELEMENT beans (
description?,
(import | alias | bean)*
)>
1:
我們接下來來分析上邊這個聲明
首先,我們先來學習一個DTD
中元素聲明的語法:
<!ELEMENT 元素名稱 (元素內容)>
那我們先知道了一點,就是這個聲明是在聲明一個 beans
元素,也就是有了它,我們就可以在用這個DTD文件聲明的文檔中用 <beans></beans>
這樣的元素了。
2:
接下來 ()
里邊的就是元素內容了,也就是 這個元素都可以包含什么子元素.
第一個description?
要明白這個,我們得再學習一個語法:
//聲明出現0次或1次的元素
<!ELEMENT 元素名稱 (子元素名稱?)>
也就是beans
元素下邊,description
子元素只能出現0次或1次。
3:
(import | alias | bean)*
這個涉及到兩個語法:
|
當然就是或了,也就是當我們需要統一設定一些元素的屬性時就要用到它了
*
和 ?
一樣也是通配符,代表 可以出現0次或多次
總結:
我們總結一下這個聲明的意思就是,我們聲明了一個beans元素,他的子元素包含只能出現 0次或1次的description元素,還有可以出現0次或多次的 import, alias,bean元素
第二個例子
<!ATTLIST beans default-lazy-init (true | false) "false">
這個就是元素屬性的定義了,我們先來看一下語法:
<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認值>
(en1|en2|...)
此值是枚舉列表中的一個值
那上邊這個定義的意思就很顯示了:
我們定義了一個 beans
元素的屬性 名為 default-lazy-init
它的值可以為 true或者false
它的默認值為 false
這個暫時先了解到這兒了。
2. xml schema
我們再來看一個 pom
的例子:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yl</groupId>
<artifactId>BootStudy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
xmlns
這個就是xml命名空間了,用來區分元素名字相同,但功能不同的元素,像一個唯一id,所寫明的網址也不一事實上就是一個確定有效的網址。
xmlns:xsi
這個就稍有一些復雜了,xsi的全稱是 xml schema instance。
我們先大概解釋下 xml schema,這個呢就像上邊我們所說的DTD,也是用來規范這個xml中應該有什么元素,什么屬性, 都是什么樣的,不過比DTD更強大就是了。
好,我們繼續,xmlns:xsi 指的就是我們這個xml schema 文件里邊的定義要遵循什么規范,注意:這個不是規范這個xml文檔里的元素的,而是規范 xml schema的
xsi:schemaLocation
這個就是具體的xml schema文件了,后綴是xsd (xml schema defination) ,第一部分是這個xsd 需使用的命名空間,第二部分就是具體的xsd文件的位置了。