【WebService】第二章、XML文件命名空間以及約束

本章主要介紹一下XML文件的命名空間,爲以後學習WebService打下基礎。

1、瘋狂XML講義中對XML文檔的分類。

      1. 格式不良好(malformed)的XML文檔。例如:完全沒有遵守XML規則,亂寫!標籤不成對,反正不是個正經的XML文檔。

      2. 格式良好(well-formed)但無效的XML文檔。例如:格式完全正確,但是缺少DTD或者Scheam語意約束。可以隨便添加元素。

      3. 有效(valid)的XML文檔。例如:格式正確,並且擁有完整的語意約束是個正經的XML文檔。

2、命名空間的介紹

      這裏並不詳細介紹DTD與Scheam,只要求能夠讀懂XML文檔即可。如果感興趣推薦《瘋狂XML講義》,可以看一看的。

     下面將貼出一個常見的XML文檔,主要講解下XML中的各個要素。爲以後看WSDL提供前置技能。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                     http://www.springframework.org/schema/context
                     http://www.springframework.org/schema/context/spring-context-3.0.xsd">
                     
  <context:annotation-config/>

  <bean id="idName" class="com.ztesoft.some.ClassName" />
  
</beans>

      一個XML文檔只有一個根節點,上面的文檔是Spring中的一部分配置。在XML文件中首先根節點beans上引入了XML的約束Scheam。

在這裏面有兩個需要注意的地方:命名空間,前綴(別名)。

      爲了說明爲什麼要有命名空間,這裏舉個生活中的例子。

      假如你是研發部的員工,你們部門有個人叫張偉。你和他玩的特別好,天天中午你都會說,張偉我們吃飯去。就這樣日子過得挺

平淡的,終於到了過年的時候了,公司開年會,到了抽獎環節的時候這個叫張偉的運氣特別好中了一等獎。主持人說,恭喜張偉獲得

本次年會一等獎,有請張偉上臺領獎!突然站起來2個人。臥槽,當時主持人就懵B了。然後主持人很機智的說,你們猜猜是哪個部門

的張偉?研發部?銷售部?最終原來鬧了一個笑話,是銷售部的。再見

      例如下面這份文檔,也能夠說明一個問題

<?xml version="1.0" encoding="UTF-8"?>
<年會 >
	<抽獎>
		<一等獎>
			<名稱>張偉</名稱>
			<名稱>蘋果</名稱>
		</一等獎>
	</抽獎>
</年會>

      在這個文檔中,一等獎下面有兩個名稱元素。你能夠一眼看出來,張偉是人名,蘋果是獎品。但是計算機卻不認識啊。我們需要添加

修飾詞語,並且修飾詞是唯一的。在這裏能夠確定唯一元素的描述,叫命名空間。也就是說,這個元素屬於哪個空間內的。例如java中的

包名,就是一種命名空間。因爲你寫個類叫StringUtils,別人也可以寫那個。難道不會衝突嗎,所以添加命名空間用來表示這是屬於哪個

空間內的就沒問題了。所以修改後的就是:

<?xml version="1.0" encoding="UTF-8"?>
<年會 xmlns="參與年會抽獎的員工"
      xmlns:獎品="年會抽獎獎品">
	<抽獎>
		<一等獎>
			<名稱>張偉</名稱>
			<獎品:名稱>蘋果</獎品:名稱>
		</一等獎>
	</抽獎>
</年會>

      例如上面我們會特別指定名稱是屬於哪個空間下的。上面的年會抽獎獎品就是命名空間,可是它太長了,我們就給他起一個短點的

名字叫獎品。一般來說別名是隨意的。上面參與年會抽獎員工卻不用添加,這是因爲他默認的是空。不寫表示是屬於員工範圍內的名稱。

      下面看上面Spring中的配置文件的詳細說明:

      xmlns :表示xml的nameSpaces 也就是xml命名空間。

      xmlns:context :這裏引入了一個命名空間,並且給他起了一個短的名字叫context。想用這個空間內的元素就添加這個前綴說明下。

      xsi:schemaLocation:這裏的schemaLocation元素在默認範圍和context範圍內都沒有。所以引入他,也就是xmlns:xsi="xxxx“那裏

引入的。然後我使用了那個範圍的元素。schemaLocation這個是幹嘛的呢?你只說明了命名空間,這沒用的。他找不到約束他

的xsd(schema)在哪裏,所以這個schemaLocation用來說明,這個命名空間的約束文件在哪裏。這個空間的又在哪裏。這樣

我們就可以找到文件了。具體語法就是先寫命名空間,在寫對應的文件地址。你會發現schemaLocation奇數行都在上面的

xmlns:xxx裏面出現過,偶數行都是xxxxxx.xsd表示文件位置。

      annotation-config:這個元素是context範圍的,所以添加了前綴表示他屬於哪個裏面的。

      bean:這個元素屬於默認空間內的。所以不寫沒問題。

3、schema的介紹

      上面介紹了XML文檔,並且多次提到了約束他的東西schema。其實你可以把xml看做是java的實例,而schema則是定義的類。

      下面貼一份schema的案例,就用wsdl來說明。

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tns="http://WebXml.com.cn/"
	xmlns:s="http://www.w3.org/2001/XMLSchema" 
	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	targetNamespace="http://WebXml.com.cn/"	>
	<wsdl:types>
		<s:schema elementFormDefault="qualified" >
			<s:element name="string" nillable="true" type="s:string" />
		</s:schema>
	</wsdl:types>
</wsdl:definitions>

      上面就是一份簡單的Schema文檔,對比Spring的配置文件你發現差不多。其實Schema也是一個xml文件。所以他也需要約束,

引入的約束就是第三行xmlns:s="http://www.w3.org/2001/XMLSchema" 所以你會發現下面第七行用到了裏面的元素,前面就添加

了別名。以及wsdl也是的。這裏你會發現他沒有schemaLocation,以及多出了一個元素targetNamespace。

      targetNamespace:目標命名空間,這是一個schema。這個文件寫好以後別的實例文件會引用的。引用的時候需要寫

xmlns:xxx="XXXXX"。所以需要定義說明下如果你想用這個文件,你就用這個命名空間就好了。所以這裏的值需要唯一在第二行

有xmlns:tns 意思就是說,如果我在這個文件中定義了一個新元素,下面要用到了就可以使用tns:xxx這種形式說明下。如果你寫

直接xxx元素名,他就認爲是默認命名空間的。

4、特別說明

      一般來說爲了確定命名空間的唯一性,我們都使用公司網站域名。因爲域名是唯一的,所以自然就是唯一的了。

所以你看到的命名空間都是網址形式。而java類裏面的包則是域名的倒寫,如果正着寫一開始就不在一個包下了。

發佈了54 篇原創文章 · 獲贊 67 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章