xml入門


 

1.常見用途

(1) 數據傳送通用格式

比如qq之間的數據傳送做案例進行詳細講解,用xml格式來傳送數據,具有良好的可讀性性,可維護性。

image

(2)配置文件

xml文件做配置文件可以說非常的普遍,比如我們的tomcat服務器的server.xml ,web.xml 。 在比如我們的struts中的struts-config.xml文件,和hibernate的hibernate.cfg.xml .....

(3) 充當小型數據庫

xml文件做小型數據庫,也是不錯的選擇,我們程序中可能用到一些經常要人工配置的數據,如果放在數據庫中讀取不合適(因為你要增加維護數據庫工作),則可以考慮直接用xm來做小型數據庫【比如msn中保存用戶聊天記錄就是用xml文件的】,而且直接讀取文件顯然要比讀取數據庫快。

2.Xml語法

入門案例: xml來記錄一個班級信息

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <xml-body>
 3 <class>
 4     <stu id="001">
 5         <name>楊過</name>
 6         <sex></sex>
 7         <age>30</age>
 8     </stu>
 9     <stu id="002">
10         <name>李莫愁</name>
11         <sex></sex>
12         <age>20</age>
13     </stu>
14 </class>
15 </xml-body>
View Code

☞ 編碼問題:

ansi american national standard insititu 美國國家標准協會

ansi 編碼在不同的國家是不一樣的,更確切的說是和操作系統的語言是一直的,例如我們現在用的操作系統是簡體中文版,即gb2312,則此時ansi編碼的表現形式就是gb2312。但是如果你使用的是繁體中文則ansi的表現形式就是gbk或者big5。如果你使用的操作系統韓語版的,則ansi的表現則為韓文操作系統默認的編碼。所以在xml中定義編碼(encoding)的時候,一定要和文件的編碼方式一直,否則會出錯:

image

(1)    文檔聲明

<?xml version=”1.0” encoding=”編碼方式” standalone=”yes|no”?>

XML聲明放在XML文檔的第一行

XML聲明由以下幾個部分組成:

version - -文檔符合XML1.0規范,我們學習1.0

encoding - -文檔字符編碼,比如”gb2312”

standalone - -文檔定義是否獨立使用

standalone="yes“

standalone=“no”   默認

(2)    一個xml 文檔中,有且只有一個根元素(元素==標簽==節點)

(3)    對於XML標簽中出現的所有空格和換行,XML解析程序都會當作標簽內容進行處理。例如:下面兩段內容的意義是不一樣的:

<name>xiaoming</name>

不等價與

<name>
    xiaoming
</name>

由於在XML中,空格和換行都作為原始內容被處理,所以,在編寫XML文件時,要特別注意。

(4) 屬性值用雙引號(")或單引號(')分隔(如果屬性值中有',用"分隔;有",用'分隔),一個元素可以有多個屬性,它的基本格式為:<元素名 屬性名="屬性值">

特定的屬性名稱在同一個元素標記中只能出現一次屬性值能包括<, >, &

特別說明: 如果屬性值有單引號,又有雙引號,則需要使用實體: html->&nbsp; &copy;

特殊字符 < > & " '
實體 &lt; &gt; &amp; &quot; &apos;
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <xml-body>
 3 <class>
 4     <stu id="a&quot;0&apos;0&apos;1">
 5         <name>楊過</name>
 6         <sex></sex>
 7         <age>30</age>
 8     </stu>
 9     <stu id="002">
10         <name>李莫愁</name>
11         <sex></sex>
12         <age>20</age>
13     </stu>
14 </class>
15 </xml-body>
View Code
image

一個XML元素可以包含字母、數字以及其它一些可見字符,但必須遵守下面的一些規范:

     星星區分大小寫,例如,<P>和<p>是兩個不同的標記。

     星星不能以數字或"_" (下划線)開頭。

     星星不能包含空格。

     星星名稱中間不能包含冒號(:)。

(5) CDATA

有些內容可能不想讓解析引擎解析執行,而是當作原始內容處理,用於把整段文本解釋為純字符數據而不是標記的情況。包含大量<、>、&或者"字符。CDATA節中的所有字符都會被當作元素字符數據的常量部分,而不是XML標記。

語法:

<![CDATA[

  ……

]]>

可以輸入任意字符(除]]>外),不能嵌套

有時我們希望傳遞一些特殊字符, <>@!#$%^&*( 可以使用 CDATA節包括)

<intro><![CDATA[這個是好$$128qw8o8<Lk;>;akdf0sa98u329408><<K>>>學生]]></intro>

面試題:

; 如何適用xml 去傳遞小圖片

答: 可以把文件讀取成一個byte[] ,然后放到  CDATA節,再傳遞.

xml語法小結:

XML聲明語句

星星<?xml version="1.0" encoding="gb2312"?>

星星必須有且僅有一個根元素

星星標記大小寫敏感

星星屬性值用引號

星星標記成對

星星空標記須關閉

星星元素正確嵌套

星星名稱中可以包含字母、數字或者其它字符

星星名稱中不能含空格

星星名稱中不能含冒號(注:冒號留給命名空間使用)

3. dtd(xml文件約束)

3.1基本概念

dtd ( document type definition  文檔類型定義),該文件一般和xml文件配合使用, 主要的用途是約束xml, 除了dtd 技術外,還有一個schema的技術也可以用於約束xml文件的書寫規范.

3.2問題引出及解決:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <xml-body>
 3 <class>
 4     <stu id="a"0'0'1">
 5         <name>楊過</name>
 6         <sex></sex>
 7         <age>30</age>
 8         <面積>100平方</面積>
 9     </stu>
10     <stu id="002">
11         <name>李莫愁</name>
12         <sex></sex>
13         <age>20</age>
14     </stu>
15 </class>
16 </xml-body>
View Code

怎么能給一個人添加一個面積元素呢?由於現在的xml處於自由狀態,沒有受到任任何約束,所以想怎么寫就怎么寫,所以就可以使用dtd來限制它。

解決xml過於自由的問題:->dtd

3.3 dtd和xml的關系:

e472033f-e1df-43b3-8a50-07252682dbb5

3.4 dtd元素

3.4.1語法

bd792abb-01ca-4f54-96b0-eda9936965fb

示例:

1 <!ELEMENT family (person+)>
2 <!ELEMENT person EMPTY>
View Code
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE family SYSTEM "dtdTest.dtd">
3 <family>
4     <person></person><!-- 正確 -->
5     <person><name>zhangsan</name></person><!-- 錯誤 -->
6 </family>
View Code

 image

因為我們設定person元素必須為空。而在xml文件中我們給它添加了子元素。

1 <!ELEMENT family (person+)>
2 <!ELEMENT parent (#PCDATA)>
3 <!ELEMENT person ANY>
View Code
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE family SYSTEM "dtdTest.dtd"><!-- 術語dtd的引入,后面會講到 -->
3 <family>
4     <person></person><!-- 正確 -->
5     <person>zhangsan</person><!--正確,表示,ANY包含字符串-->
6     <person><parent>zhanger</parent></person><!-- 正確,因為parent在dtd中有定義-->
7     <person><parent><person>zhanger</person></parent></person><!-- 錯誤,因為parent被定義為只能含有字符串不能含有dtd中定義的元素 -->
8     <person><name>zhangsan</name></person><!-- 錯誤,因為name在dtd中沒有定義 -->
9 </family>
View Code

3.4.2 dtd的元素的修飾符

image

3.5 dtd元素屬性

基本語法

image

屬性的類型有五種:

CDATA 表示可以放入文本

ID   表示屬性的值,不能重復,同時不要用數字開頭.

IDREF/IDREFS   當一個元素的屬性值,需要去引用另外一個ID ,則使用IDREF,如果希望引用多個,則使用IDREFS,請用空格隔開.

Enumerated  表示屬性的值,只能是例舉出了的。

屬性的特點有四種

#REQUIRED  表示必須有

#IMPLIED 表示可以有

#FIXED “值” 表示如果有,則必須是什么

Default “值” 表示如果不指定,則默認.

如:

 1 <!ELEMENT family (person+)>
 2 <!ELEMENT person ANY>
 3 <!ATTLIST person
 4     name        ID                               #REQUIRED
 5     sex            (male|female)        #REQUIRED
 6     address    CDATA                     #FIXED "福州"
 7     father        IDREF                      #IMPLIED
 8     mother    IDREF                       #IMPLIED
 9     son             CDATA                    "not has son"
10 >
View Code
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE family SYSTEM "dtdTest.dtd"><!-- 術語dtd的引入,后面會講到 -->
3 <family>
4     <person name="father" sex="male"/>
5     <person name="mother" sex="female"/>
6     <person name="son" sex="male" father="father" mother="mother"/>
7 </family>
View Code

實體(ENTITY)

實體用於為一段內容創建一個別名,以后在XML文檔中就可以使用別名引用這段內容了。

就像在java 中,我們定義了一個字符串:

String str=”你好”;

這樣,在別的地方,我們使用str就可以訪問到  ‘你好’

 

在DTD定義中,一條<!ENTITY …>語句用於定義一個實體。

實體可分為兩種類型:引用實體和參數實體。

引用實體

引用實體主要在 XML 文檔中被應用

語法格式(dtd中定義):

<!ENTITY 實體名稱 “實體內容”>

引用方式(xml中引用)

&實體名稱;

案例

dtd 中定義:

<!ENTITY mycopy "我的公司版權">

注:最好把定義放在dtd的最后

xml中使用:

&mycopy;

參數實體

參數實體被 DTD 文件自身使用

語法格式:

<!ENTITY % 實體名稱 "實體內容" >

引用方式:

%實體名稱;

示例1:

image

示例2:

<!ENTITY % 實體名稱 "實體內容" >
 1 <!ELEMENT 班級 (學生*)>
 2 <!ENTITY % myname "名字">
 3 <!ELEMENT 學生 (%myname;,介紹,年齡)>
 4 <!ATTLIST 學生
 5    地址 CDATA #FIXED "北京"
 6    學號 ID #REQUIRED
 7    大哥 IDREFS #REQUIRED
 8    性別 (男|女) #REQUIRED
 9 > 
10 <!ELEMENT %myname; (#PCDATA)>
11 <!ELEMENT 年齡 (#PCDATA)>
12 <!ELEMENT 介紹  (#PCDATA)>
13 
14 <!ENTITY mycopy "我的公司版權">
View Code

3.6 快速入門案例

Xml1.dtd

1 <!ELEMENT 班級 (學生+)><!--表示:班級元素內含有至少一個學生元素-->
2 <!ELEMENT 學生 (名字,年齡,介紹)><!--表示:學生元素內可以含有名字,年齡,介紹等屬性-->
3 <!ELEMENT 名字 (#PCDATA)><!--表示:名字屬性的值可以包含任何字符串,但是不能含有定義在該dtd中的其他元素-->
4 <!ELEMENT 年齡 (#PCDATA)>
5 <!ELEMENT 介紹 (#PCDATA)>
View Code

Xml1.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2   <!--引入dtd去約束該xml文件-->
 3   <!DOCTYPE 班級 SYSTEM "myClass2.dtd">
 4   <班級>
 5     <學生>
 6          <名字>周星馳</名字>
 7          <年齡>23</年齡>
 8          <介紹>學習刻苦</介紹>
 9      </學生>
10      <學生>
11          <名字>林青霞</名字>
12          <年齡>32</年齡>
13          <介紹>是一個好學生</介紹>
14      </學生> 
15 </班級>   
View Code

注:現在可能還看不懂一些里面的東西,我們后面會一一說明的。

編程校驗XML文檔正確性(xmlspy) :

IE5以上瀏覽器內置了XML解析工具:Microsort.XMLDOM,開發人員可以編寫javascript代碼,利用這個解析工具裝載xml文件,並對xml文件進行dtd驗證。

創建xml文檔解析器對象:

 1 <html>
 2   <head>
 3     <title>xmlspy.html</title>
 4     <!--自己編寫一個簡單的解析工具,去解析xml dtd 是否配套-->
 5      <script language="javascript">
 6               var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
 7               xmldoc.validateOnParse = "true";//開啟校驗
 8               xmldoc.load("Xml1.xml");//指定校驗哪個xml文件
 9               document.writeln("錯誤信息是:"+xmldoc.parseError.reason+"<br/>");  
10               document.writeln("錯誤的行是:"+xmldoc.parseError.line);
11      </script>
12   </head>
13   
14   <body/>
15 </html>
View Code

這樣我們就可以檢測我們的xml是否有誤了:

由於,我們剛才寫的Xml1.xml是符合dtd規則的。所以該html顯示為:

image

隨着后面的講解,我們會把錯誤顯示出來的。

3.7 dtd 的分類

(1)內部 dtd

 1 <?xml version='1.0' encoding='gb2312'?>
 2 <!DOCTYPE poem[       <----------------根元素的名稱
 3 <!ELEMENT poem (author,title,content) ><---------------------子元素的名稱及順序
 4 <!ELEMENT author (#PCDATA)><------------------子元素的數據類型
 5 <!ELEMENT title (#PCDATA)>
 6 <!ELEMENT content (#PCDATA)>
 7 ]> <------------------------結束標簽
 8 
 9 <poem>
10     <author>王維</author>
11     <title>鹿柴</title>
12     <content>空山不見人,但聞人語聲.
13                  返景入深林,復照青苔上.
14     </content>
15 </poem>
View Code

em9注意:例中的定義關鍵字一定要大寫,如DOCTYPE、ELEMENT、#PCDATA,且元素名稱與數據類型之間也要有空格。

(2)外部 dtd

dtd文件:

1 <?xml version="1.0" encoding="gb2312"?>
2 <!ELEMENT poem (author,title,content)>
3 <!ELEMENT author (#PCDATA)>
4 <!ELEMENT title (#PCDATA)>
5 <!ELEMENT content (#PCDATA)>
View Code

xml文件:

1 <? xml version='1.0' encoding='gb2312' ?>
2 <!DOCTYPE poem SYSTEM "ex2.dtd">
3 <poem>
4   <author>王維</author>
5   <title>鹿柴</title>
6   <content>空山不見人,但聞人語聲.返景入深林,復照青苔上.</content>
7 </poem>
View Code

3.8  xml中引入dtd 的方法

(1)內部dtd

不用引入。

(2)外部dtd

<1>引入本地 dtd

<!DOCTYPE 根元素 SYSTEM ‘地址’>

<2> 引入公共的 dtd

<!DOCTYPE 根元素 PUBLIC  ‘url地址’>

<3>內外部dtd

<!DOCTYPE 根元素  SYSTEM "DTD文件路徑" [
  定義內容
  ]>

3.9 學習dtd的目標

一般公司很少讓程序員自己寫 dtd,要求程序員看的懂dtd,同時可以根據給出的dtd,寫出對應的xml

3.10 DTD的局限性

   星星DTD語法與XML語法存在差異;

   星星缺少對XML名稱空間的支持;

   星星缺少數據分類;

   星星內容模型描述收到限制。

4. xml 命名空間

用途:XML 命名空間提供避免元素命名沖突的方法。

4.1 問題的引出

xml1.xml

1 <table>
2    <tr>
3    <td>Apples</td>
4    <td>Bananas</td>
5    </tr>
6 </table>
View Code

xml2.xml

1 <table>
2     <name>African Coffee Table</name>
3     <width>80</width>
4     <length>120</length>
5 </table>
View Code

當xml1.xml和xml2.xml放在一起使用的時候,我們便分不清,table到底代表xm1.xml中定義的還是xml2.xml中定義的那個。

因此,在 XML 中,當兩個不同的文檔使用相同的元素名,並且它們放在一起使用時,由於兩個文檔都包含帶有不同內容和定義的相同名稱的元素,就會發生命名沖突。

4.2 解決之道

 1 <h:table xmlns:h="http://www.w3.org/TR/html4/">
 2    <h:tr>
 3    <h:td>Apples</h:td>
 4    <h:td>Bananas</h:td>
 5    </h:tr>
 6 </h:table>
 7  
 8 <f:table xmlns:f="http://www.w3school.com.cn/furniture">
 9    <f:name>African Coffee Table</f:name>
10    <f:width>80</f:width>
11    <f:length>120</f:length>
12 </f:table>
View Code

4.3定義

1 xmlns:namespace-prefix="namespaceURI"
2 
3 <h:table xmlns:h="http://www.w3.org/TR/html4/">
4    <h:tr>
5    <h:td>Apples</h:td>
6    <h:td>Bananas</h:td>
7    </h:tr>
8 </h:table>
View Code

這樣我們就可以使用前綴h來限定元素的確切含義了。

默認命名空間的定義:

1 xmlns="namespaceURI"
2 <table xmlns="http://www.w3.org/TR/html4/">
3    <tr>
4    <td>Apples</td>
5    <td>Bananas</td>
6    </tr>
7 </table>
View Code

馬上回來注:用於標示命名空間的地址不會被解析器用於查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。改地址有一個響亮的名字:URI(統一資源定位符)。URI最大的特點就是唯一性。

5. XML Schema(XSD)

XML Schema 是基於 XML 的 DTD 替代者。

XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition,XSD)。

XSD能干什么驚訝

定義可出現在文檔中的元素

定義可出現在文檔中的屬性

定義哪個元素是子元素

定義子元素的次序

定義子元素的數目

定義元素是否為空,或者是否可包含文本

定義元素和屬性的數據類型

定義元素和屬性的默認值以及固定值

由此可見,XSD比DTD厲害的多啊,那我們還需要DTD嗎?

非常需要!因為:(1)XSD沒有提供ENTITY功能。但是在很多的xml中ENTITY占有很重要的地位,如,RDF,OWL中;(2)DTD是XML推薦標准里唯一的定義和驗證方法。

遵守某個特定的XML Schema的XML文件稱為XML Schema的一個實例文檔。

5.1 快速入門

schema的功能和dtd的功能一樣,都是用來限制xml的。所以我需要在xml文件中插入schema文件的引用。為了能在編寫xml是得到只能提示,我就在的spring的配置文件(applicationContext.xml)里面編寫xml(應該有比較簡便的放xml智能提示,有知道的大俠,望不吝賜教):

首先在MyEclipse中新建一個web工程,並加入spring框架,applicationContext.xml一般在src目錄下,為了簡便起見,我們就在src目錄下創建我們的Schema文件——name.xsd,內容如下(先不要管內容是什么意思,后面會一一講解):

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <schema xmlns="http://www.w3.org/2001/XMLSchema"
 4 
 5 xmlns:target="http://www.example.com/name"
 6 
 7 targetNamespace="http://www.example.com/name"
 8 
 9 elementFormDefault="qualified">
10 
11     <element name="name">
12 
13         <complexType>
14 
15             <sequence>
16 
17                 <element name="first" type="string"/>
18 
19                 <element name="middle" type="string"/>
20 
21                 <element name="last" type="string"/>
22 
23             </sequence>
24 
25             <attribute name="title" type="string"/>
26 
27         </complexType>
28 
29     </element>
30 
31 </schema>
View Code

然后打開實例文檔(applicationContext.xml),在這個文件里面編寫我們的待檢驗文件,首先引入Schema文件,

image

然后我們編寫xml文件時,便有提示功能:

image

通過編寫代碼來驗證xml文件的正確性:

image

image

Schema文檔中,element元素定義了實例文檔中可以含有的元素,attribute元素定義了實例文檔中特定元素含有的屬性,type屬性表示對應的實例文檔中對應的元素或屬性的類型。

5.2 <schema>聲明

XML Schema 文件的跟元素是<schema>該元素中包含如下屬性:

image

我們只說幾個重點的屬性:

首先來看version,這個屬性是一個非常簡單的屬性,用來標記XML Schema的版本。

targetNamespace(目標命名空間):XML Schema主要是用來聲明在其實例文檔中可以使用的詞匯的。而這些詞匯就是由targetNamespace屬性里指定的一個命名空間來標識的。當聲明一個targetNamespace屬性時,就一定要插入友好的命名空間聲明,如:

xmlns:target="http://www.example.com/name"
targetNamespace="http://www.example.com/name"

或者使用默認命名空間聲明,如:

<xsd:schema  xmlns="http://www.example.com/name"
targetNamespace="http://www.example.com/name"

elementFormDefault、attributeFormDefault表示元素或屬性的限定方式,有兩種即限定和不限定。如果一個元素或者屬性關聯到一個命名空間,就是限定的。反之則是不限定的。如,下面就是限定的:

 1 <n:name title="Mr.">
 2     <n:first>Jone</n:first>
 3     <n:middle>hello</n:middle>
 4     <n:last>Doe</n:last>
 5 </n:name>
 6 <n:name></n:name>
 7 
 8 <name xmlns="http://www.example.com/name">
 9     <first>Jone</first>
10     <middle>hello</middle>
11     <last>Doe</last>
12 </name>
View Code

非限定的就比如:

1 <n:name title="Mr.">
2     <first>Jone</first>
3     <middle>hello</middle>
4     <last>Doe</last>
5 </n:name>
View Code

利用這兩個屬性就可以控制實例文檔中元素和屬性的默認限定值。它們默認值都為"unqualified"(非限定的)。

5.3 <element>聲明

(1)元素的類型

元素的內容的類型是有type屬性決定的。根據類型定義的位置的不同,該類型可分為兩種:全局類型與局部類型。

Schema中其他的聲明也一樣,根據定義的位置的不同可分為全局聲明和局部聲明。

全局聲明:<schema>為其直接父親,可以在整個XML Schema中被重用。

局部什么:<schema>為其祖先但並非直接父親,只能在指定的上下文中使用。

(2)默認值和固定值

我們可以通過default和和fixed屬性為元素設定默認值和固定值。如:

1 <xsd:element name="last" type="xsd:string" default="Doe"/>

則在實例文檔中

<last></last>或者<last/>

將被解析為<last>Doe</last>

當我們希望某些元素的值不能變化的時候就用fixed將其設定為固定值。

1 <xsd:element name="version" type="xsd:string" fixed="1.0"/>

這時,實例文件中如下的形式是合法的:

1 <version>1.0</version>
2 <version></version>
3 <version/>
View Code

下面的形式就是非法的:

1 <version>2.0</version>

(3)元素通配符

包含任何命名空間中的元素的聲明稱為通配符。利用通配符可以把一個命名空間里的任何一個元素插入到XML Schema中。

聲明一個元素通配符要用到<any>,它只能聲明在內容模型中,不允許創建全局<any>。<any>聲明還可以用來控制元素來自哪個或那些命名空間,為此需要namespace屬性,namespace的允許取值為:

image

我們還可以通過processContents屬性來指示模式驗證器采用何種方式驗證實例文檔:

星星strict(默認值):處理器驗證通配符元素。如果驗證器找不到通配符元素的全局XML Schema定義,則模式驗證器報錯;

星星lax:如果處理器可以訪問到通配符的全局XML Schema定義,則驗證這些通配符元素;

星星skip:處理器將忽略實例文檔中所有的通配符元素。

5.4 <attribute>聲明

屬性的聲明格式如下:

image

與元素一樣,屬性也可以分為全局屬性和局部屬性。定義方式和定義元素的一樣。

(1)屬性的使用

通過use屬性來指定屬性在實例文檔中出現的方式:

required:必須出現

prohibited:禁用的

optional(默認值):可以出現也可以不出現

如果我們為一個屬性定義了默認值,那么use的取值就不能是required和prohibited了。

(2)屬性通配符

和元素通配符一樣。用來包括來自一個命名空間的任何屬性的聲明稱為屬性通配符。

聲明一個屬性通配符:

image

它只能聲明在<complexType>或者<attributeGroup>聲明內,不能建立全局<anyAttribute>聲明。

其中,namespace的允許取值:

image

processContents屬性的用途及機制和屬性的一樣。

例,希望包含任何非限定屬性以及來自http://www.w3.org/XML/1998/namespace命名空間的屬性。用屬性通配符實現如下:

1         <xsd:complexType>
2             <xsd:sequence>
3                 <xsd:element name="first" type="xsd:string" />
4                 <xsd:element name="middle" type="xsd:string" />
5                 <xsd:element name="last" type="xsd:string" default="Doe"/>
6                 <xsd:any namespace="##any" processContents="strict"/>
7             </xsd:sequence>
8             <xsd:anyAttribute namespace="##local http://www.w3.org/XML/1998/namespace" processContents="lax"/ ></xsd:anyAttribute>
9         </xsd:complexType>
View Code

5.5 Schema中的類型

Schema中主要包括三種部件:元素(element)、屬性(attribute)、注釋(notation)。

這三種基本的部件還能組合成以下的部件:

a)類型定義部件: 簡單類型和復合類型
b)組部件
c)屬性組部件

5.5.1 簡單類型

1 <?xml version="1.0" encoding="UTF-8"?>
2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
3     <xs:element name="quantity" type="xs:nonNegativeInteger"></xs:element>
4 </xs:schema>
View Code

XML Schema中定義了一些內建的數據類型,這些類型可以用來描述元素的內容和屬性值。

定義:一個元素中如果僅僅包含數字、字符串或其他數據,但不包括子元素,這種被稱為簡單類型。如同上述代碼中元素quantity就是一個簡單類型。它的元素內容必須是非負整數,不包括任何屬性和子元素。

所有內建的簡單類型

原始類型

string,boolean,decimal,float,double,duration,datetime,time,date,gYearMonth,gYear,gMonthDay,dDay,gMonth,hexBinary,base64Binary,any URI,QNameNOTATION
衍生類型(括號中為基類型)
normalizedString(string),language(tonken),token(normalizedString),NMTOKEN(token),Name(token),NCName(Name),ID(NCName),IDREF(NCName),IDREFS(list of IDREF),ENTITY(NCName),ENTITIES(list of ENTITY),integer(decimal),nonPositiveInteger(integer),negativeInteger(noPositiveInteger),long(integer),int(long),short(int),byte(short),nonNegativeInteger(integer),unsignedLong(nonNegativeInteger),unsignedInt(unsignedLong),unsignedShort(unsignedInt),unsignedByte(unsignedShort),positiveInteger(nonNegativeInteger)

創建簡單類型

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 3     <simpleTypye name="quantityType">
 4         <restriction base='integer'>
 5             <minInclusive value="2"/>
 6             <maxInclusive value="5"/>
 7         </restriction>
 8     </simpleTypye>
 9     <element name="quantity" type="quantityType"/>
10 </schema>
View Code

我們先創建了一個簡單類型:quantityType,它是從integer繼承過來的,minInclusive和maxInclusive定義了它的最小值2和最大值5。最后我們定義元素quantity的類型為quantityType。

1 <!--正確-->    <quantity>3</quantity>
2 <!--錯誤-->    <quantity>10</quantity>
3 <!--錯誤--> <qauntity>aaa</quantity>
View Code

使用restriction我們可以限制只能接受一定數值或者只能接受一定文字,

基本方面:equal,ordered,bounded,cardinality,numeric
限制方面:length,minLength,maxLength,pattern,enumeration,whiteSpace,maxInclusive,maxExclusive,minInclusive,minExclusive,totalDigits,fractionDigits

例1:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 3     <xsd:simpleType name="ChinaCity">
 4         <xsd:restriction base="xsd:string">
 5             <xsd:enumeration value="BeiJing"/>
 6             <xsd:enumeration value="FuZhou"/>
 7             <xsd:enumeration value="LanZhou"/>
 8             <!-- and so on -->
 9         </xsd:restriction>
10     </xsd:simpleType>
11     <element name="cityname" type="ChinaCity"/>
12 </schema>
View Code

通過enumeration來列出所有的城市名稱,取值是只能取里面列出的城市名。

1 <cityname>BeiJing</cityname><!-- 正確 -->
2 <cityname>FuZhou1</cityname><!-- 錯誤 -->
View Code

5.5.2 列表類型

1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsd:schema xmlns="http://www.test.cn"
3 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
4     <xsd:simpleType name="listOfIntType">
5         <xsd:list itemType="xsd:int"></xsd:list>
6     </xsd:simpleType>
7     <element name="IntList" type="listOfIntType"/>
8 </schema>
View Code

list可以用來定義列表類型,listOfIntType這個類型被定義為一個xsd:int的列表,元素IntList的值可以是幾個整數,它們之間使用空格隔開。

正確: <listOfMyInt>1 5 15037 95977 95945</listOfMyInt>

錯誤: <listOfMyInt>1 3 abc</listOfMyInt>

5.5.3 聯合類型

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <xsd:schema xmlns="http://www.test.cn"
 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 4     <xsd:simpleType name="ChinaCity">
 5         <xsd:restriction base="xsd:string">
 6             <xsd:enumeration value="BeiJing"/>
 7             <xsd:enumeration value="FuZhou"/>
 8             <xsd:enumeration value="LanZhou"/>
 9             <!-- and so on -->
10         </xsd:restriction>
11     </xsd:simpleType>
12     <xsd:simpleType name="listOfIntType">
13         <xsd:list itemType="xsd:int"></xsd:list>
14     </xsd:simpleType>
15     <xsd:simpleType name="zipUnion">
16         <xsd:union memberTypes="ChinaCity listOfIntType"/>
17     </xsd:simpleType>
18     <element name="zips" type="zipUnion"/>
19 </schema>
View Code

用union來定義了一個聯合類型,里面的成員類型包括ChinaCity和listOfIntType,應用了聯合類型的元素的值可以是這些原子類型或列表類型中的一個類型的實例,但是一個元素實例不能同時包含兩個類型。

1 <!--正確-->
2 <zips>CA</zips>
3 <zips>95630 95977 95945</zips>
4 <zips>AK</zips>
5 
6 <!--錯誤-->
7 <zips>CA 95630</zips>
View Code

5.5.4匿名類型定義

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <xsd:schema xmlns="http://www.test.cn"
 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 4     <xsd:element name="quantity">
 5         <xsd:simpleType>
 6             <xsd:restriction base="xsd:positiveInteger">
 7                 <xsd:maxExclusive value="100"/>
 8             </xsd:restriction>
 9         </xsd:simpleType>
10     </xsd:element>
11 </schema>
View Code

前面我們在定義元素類型時總是先定義一個數據類型,然后再把元素的type設成新定義的數據類型。如果這個新的數據類型只會用一次,我們就可以直接設置在元素定義里面,而不用另外來設置。如圖中元素quantity的類型就是一個從1到99的整數。

這種新的類型沒有自己的名字的定義方法我們稱之為匿名類型定義。

5.5.5 復合類型

前面我們所說到的都是屬於簡單類型,即元素里面只有內容,不再包括屬性或者其它元素。接下來我們要讓元素里面包含屬性和其它元素,稱之為復合類型。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <xsd:schema xmlns="http://www.test.cn"
 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 4     <xsd:element name="internationPrice">
 5         <xsd:complexType>
 6             <xsd:simpleContent>
 7                 <xsd:extension base="xsd:decimal">
 8                     <xsd:attribute name="currency" type="xsd:string"/>
 9                 </xsd:extension>
10             </xsd:simpleContent>
11         </xsd:complexType>
12     </xsd:element>
13 </schema>
View Code

我們用complexType表示這是一個復合類型(這里我們是用匿名類型定義的)。simpleContent表示這個元素下面不包括子元素,extension表示這個元素值是decimal的,attribute來設置它的一個屬性currency,類型為string.

<internationPrice currency="str">3.1415926</internationPrice><!-- 正確 –>

5.5.6混合內容

同樣,我們采用了匿名類型方式來定義一個元素salutation。我們注意到在complexType后面多了一個mixed="true",這表明這是一個混合類型里面既有元素本身的內容,又有其它子元素。name元素就是salutation的子元素

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <xsd:schema xmlns="http://www.test.cn"
 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 4     <xsd:element name="salutation">
 5         <xsd:complexType mixed="true">
 6             <xsd:sequence>
 7                 <xsd:element name="name" type="xsd:string"/>
 8             </xsd:sequence>
 9         </xsd:complexType>
10     </xsd:element>
11 </schema>
View Code

驚訝sequence表示子元素出現的順序要和schema里面的順序一樣

1 <!-- 正確 --><salutation>Dear Mr.<name>Robert Smith</name>.</salutation>
2 <!-- 錯誤 --><salutation>Dear Mr.</salutation>
View Code

參考資料:

1. 韓順平xml視頻教程

2. XML認證教程,第 6 部分: XML Schema

3. xml入門經典


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM