1. 程式人生 > >Xml學習(3)

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>