Xml學習(3)
XMl約束【瞭解】
如下的文件,屬性的ID值是一樣的,這在生活中是不可能出現的,並且第二個學生的姓名有好幾個,一般也很少。那麼怎麼規定ID的值唯一,或者是元素只能出現一次,不能出現多次?甚至是規定裡面只能出現具體的元素名字。
<stus> <stu id="10086"> <name>張三</name> <age>18</age> <address>深圳</address> </stu> <stu id="10086"> <name>李四</name> <name>李五</name> <name>李六</name> <age>28</age> <address>北京</address> </stu> </stus>
>DTD:
語法自成一派,早就出現的,可讀性比較差。
1)引入網路上的DTD
<!-- 引入dtd 來約束這個xml -->
<!-- 文件型別 根標籤名字 網路上的dtd dtd的名稱 dtd的路徑
<!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd"> -->
2)引入本地的DTD
<!-- 引入本地的DTD : 根標籤名字 引入本地的DTD dtd的位置 --> <!-- <!DOCTYPE stus SYSTEM "stus.dtd"> -->
3)直接在XML裡面嵌入DTD的約束規則
<!-- xml文件裡面直接嵌入DTD的約束法則 --> <!DOCTYPE stus [ <!ELEMENT stus (stu)> <!ELEMENT stu (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]> <stus> <stu> <name>張三</name> <age>18</age> </stu> </stus>
<!ELEMENT stus (stu)> :stus下面有一個元素stu,但只有一個
<!ELEMENT stu (name , age)> :stu下面有兩個元素name,age,順序必須是name-age
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST stu id CDATA #IMPLIED>:stu有一個屬性id,是CDATA文字型別,該屬性IMPLIED可有可無
元素的個數:+ 一個或多個; * 零個或多個; ? 零個或一個
屬性的型別定義:CDATA:屬性是普通文字; ID:屬性的值必須唯一
<!ELEMENT stu (name , age)> 按照順序來
<!ELEMENT stu (name | age)> 兩個中只能包含一個子元素
>Schema:
其實就是一個xml,使用xml的語法規則,xml解析器解析起來比較方便,是為了替代DTD。但是Schema約束文字內容比DTD的內容還要多,所以目前也沒有真正意義上的替代DTD。
約束文件:
<!-- xmlns : xml namespace : 名稱空間 / 名稱空間
targetNamespace : 目標名稱空間 。 下面定義的那些元素都與這個名稱空間繫結上。
elementFormDefault : 元素的格式化情況。 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itheima.com/teacher"
elementFormDefault="qualified">
<element name="teachers">
<complexType>
<sequence maxOccurs="unbounded">
<!-- 這是一個複雜元素 -->
<element name="teacher">
<complexType>
<sequence>
<!-- 以下兩個是簡單元素 -->
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
例項文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns:xsi : 這裡必須是這樣的寫法,也就是這個值已經固定了。
xmlns : 這裡是名稱空間,也固定了,寫的是schema裡面的頂部目標名稱空間
xsi:schemaLocation : 有兩段: 前半段是名稱空間,也是目標空間的值 , 後面是約束文件的路徑。
-->
<teachers
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itheima.com/teacher"
xsi:schemaLocation="http://www.itheima.com/teacher teacher.xsd"
>
<teacher>
<name>zhangsan</name>
<age>19</age>
</teacher>
<teacher>
<name>lisi</name>
<age>29</age>
</teacher>
<teacher>
<name>lisi</name>
<age>29</age>
</teacher>
</teachers>
名稱空間的作用:
一個xml如果想指定它的約束規則,假設使用的是DTD,那麼這個xml只能指定一個DTD,不能指定多個DTD。但是如果一個xml的約束
是定義在schema裡面,並且是多個schema,那麼是可以的。簡單的說:一個xml可以引用多個schema約束,但是隻能引用一個DTD。
名稱空間的作用就是在寫元素的時候,可以指定該元素使用的是哪一套約束規則。預設情況下,如果只有一套規則,那麼都可以這麼寫
<name>張三</name>
<aa:name></aa:name>
<bb:name></bb:name>