1. 程式人生 > >Java Web程式設計------XML、約束

Java Web程式設計------XML、約束

2.1XML基礎

在實際開發中,不通語言專案之間資料的傳輸的格式 有可能不相容,為解決此問題w3c推出一種新的資料交換標準——XML,它是一種通用的資料交換格式,輕鬆使資料在各種程式之間交換。

2.1.2 XML概述

1.什麼是XML

現實中各種事物之間存在一定關聯關係,例如中國有很多省份,每個省份又有很多城市,這種關係可以構成樹狀圖來描述,而對於程式來說解析圖片有點困難,所以可以用XML來描述這種樹狀層次結構。

XML是extensible marking language的縮寫,類似於HTML的標記語言,成為可擴充套件標記語言,所謂可擴充套件就是——使用者可以按XML標準自定義標記。

<?xml version="1.0" encoding="UFT-8"?>
<中國>
    <山西>
        <城市>太原</城市>
        <城市>大同</城市>
    </山西>
    <河北>
        <城市>石家莊</城市>
        <城市>張家口</城市>
    </河北>
</中國>

2.XML與HTML的比較

都是標記語言,在結構上大體上相同,但有本質區別。

(1)HTML用來格式化顯示資料,XML用來傳輸和儲存資料。

(2)HTML不區分大小寫,XML嚴格區分大小寫。

(3)HTML可以有多個根元素,良好格式的XML只能有一個根元素。

(4)HTML中空格自動過濾,XML中空格不會自動刪除。

(5)HTML中的標記都是預定義的,XML中標記可以自定義並可擴充套件。

總之XML不是HTML的升級,也不是替代品。XHTML——XML應用被重新定義的HTML。

2.1.2XML的語法

1.文件宣告

XML文件中必須有一個宣告,且在第一行。

<?xml version="xml版本" encoding="編碼方式" standalone="是否為獨立文件yes/no"?>

2.元素自定義

主題都是有元素構成,元素由開始標記、屬性、元素內容、結束標記構成。

若一個元素沒有被其他元素套嵌則為根元素,若一個元素沒有 套嵌任何元素則為空元素,這時不需要使用結束標籤,在開始標籤後加/。

3.屬性定義

XML文件中可以為元素自定義屬性,屬性是對元素的進一步描述和說明。

<售價 單位="元">68</售價>

4.註釋資訊

<!-- 註釋內容  -->

2.1.3 DTD約束

1.什麼是約束

在書寫XML文件時,內容必須滿足一些條件的限制,如 <書>標籤中不能出現兩個<價格>標籤,這樣就很難區分哪個是普通價格和會員價格。在對XML文件進行約束時,同樣需要遵守一系列的語法規則,這種語法就形成的XML約束語言。最常見的兩種約束語言DTD約束和Schema約束。

2.DTD約束

book.dtd檔案:

<!ELEMENT 書架 (書+)>           <!--表示書在書架元素中出現1次或多次-->
<!ELEMENT 書 (書名,作者,售價) >  <!--表示書元素有三個子元素,且要按照順序出現-->
<!ELEMENT 書名 (#PCDATA)>       <!--表示書名元素套嵌的內容是普通的文字字元-->
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>

3.DTD的引入方式

(1)引用本地的的dtd檔案  可以為一個絕對值地址和相對地址  此時standalone屬性不能設為yes

<!DOCTYPE 根元素名稱 SYSTEM ".dtd檔案的url">

(2)引用公共的dtd檔案   地址為Internet上的一個絕對url地址

<!DOCTYPE 根元素名稱 PUBLIC "DTD名稱" ".dtd檔案的url">

(3)內嵌方式  standalone可以為yes

<!DOCTYPE 根元素名稱[
    <!ELEMENT 書架 (書+)>        
    <!ELEMENT 書 (書名,作者,售價) > 
    <!ELEMENT 書名 (#PCDATA)>       
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售價 (#PCDATA)>
]>

多個XML文件可共享一個DTD檔案

4.DTD語法

(1)元素定義<!ELEMENT>用於定義一個元素。

<!ELEMENT 元素名稱 元素內容>

元素內容有5中內容:

  • <!ELEMENT 書名 (#PCDATA)>    表示書名為普通的文字字串
  • <!ELEMENT  書(作者,單價,書名)> 表示套嵌的子元素
  • <!ELEMENT  書(#PCDATA|書名)*> 表示前兩種的混合
  • <!ELEMENT br EMPTY>  表示br為沒有內容的空元素
  • <!ELEMENT ANY>  表示可以包含任何元素,避免使用

符號:?1次或0次   *0次或多次   +1次或多次   | 列出的物件選一個  ,必須按順序出現   ()給元素分組

(2)屬性定義

<!ATTLIST 元素名
    屬性名1 屬性型別 屬性說明
    屬性名2 屬性型別 屬性說明
>

1)屬性說明中有四種設定:

  • #REQUIREN 表示元素的該屬性是必須的
  • #IMPLIED 表示元素可以包含該屬性
  • #FIXED 表示一個屬性的預設值,不能將元素設為其他值  需要提供一個預設值當不包含該屬性時自動設定為dtd中的預設值
  • 預設值 如果不包含該屬性自動設為預設值  與#FIXED不同的是該預設值可以被改變

2)屬性型別:

有10中屬性型別,常見的有

  • CDATA  表示屬性型別為字元型別,與元素內容中的#PCDATA是一樣的,屬性值設定中的特殊字元也需要使用轉義字元來表示,&amp表示&,&it表示<。
  • Enumerated  列舉型別 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 購物籃[
    <!ELEMENT 購物籃 ANY>
    <!ELEMENT 肉 EMPTY>
    <!ATTLIST 肉 品種(雞肉|牛肉|豬肉) "雞肉">

]>
<購物籃>
        <肉 品種="雞肉"/>
        <肉 品種="豬肉"/>
</購物籃>

品種為Enumerated型別,其值只能為列出來的值,預設值為雞肉

  • ID一個id型別的屬性用來唯一標示xml文件中的一個元素,id必須設定為#IMPLIED或#REQUIRED,因為對id設定預設值無意義。
<?xml versiong"1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE 聯絡人列表[
    <!ELEMENT 聯絡人列表ANY>
    <!ELEMENT 聯絡人 (姓名, EMAIL)>
    <!ELEMENT 姓名 (#PCDATA) >
    <!ELEMENT EMAIL (#PCDATA) >
    <!ATtlist 聯絡人 編號 ID #REQUIRED>
]>

<聯絡人列者>
    <聯絡人 編號="id1">
        <姓名>張三</姓名>
        <EMAIL>[email protected] cn</ EMAIL>
    </聯絡人>
    <聯絡人 編號="id2">
        <姓名>李四<7姓名>
        <EMAIL>[email protected]</ EMAIL>
    </聯絡人> 
</聯絡人列表>
  • IDREF   表示不同id之間的聯絡  在兩個元素之間建立一對一的關係
<?xml version="1.0" encoding= "UTF-8”  standalone="yes"?>
<!DOCTYPE聯絡人列表[ 
    <!ELEMENT 聯絡人列表 ANY>
    <!ELEMENT 聯絡人(姓名, EMAIL)>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT EMAIL (#PCDATA) >
    <!ATTLIST聯絡人
                編號 ID #REQUIRED
                上司 IDREF #IMPLIED>
]>
<聯絡人列表>
    <聯絡人 編號="id1">
        <姓名>張三</姓名>
        <EMAIL> [email protected] .org</EMAIL>
    </聯絡人>
    <聯絡八 編號= "id2"上司="id1">
        <姓名>李四</姓名>
        <EMAIL>[email protected] .org</EMAIL>
    </聯絡人>
</聯絡人列表>
  • IDREFS  建立一對多的關係
<!ATTLIST person borrowed REFS # REQUIRED>

<books>
    <book bookid="b0101">
        <title>Java就業培訓教材</title>
    </book>
    <book bookid="b0102">
        <title>Java Web 開發內幕</title>
    </book>
    <book bookid="b0103">
        <title>Java開發寶典</title>
    </book>
</books>
<records>
    <item>
        <data>2013-03-13</data>
        <person name="張三”borrowed="b0101 b0103" />
    </item>
    <item>
        <data>2013-05-23</data>
        <person name="李四”borrowed="b0101 b0102 b0103" />
    </item>
</records>

2.1.4Schema約束

1. Schema約束

是DTD約束的升級,他的出現克服了dtd的侷限性。

  • Schema本身採用XML語法格式,本身也是一種XML文件,更好理解。DTD採用非XML語法格式。
  • Schema採用與XML文件相同的合法性檢驗機制,與DTD的直譯器不同。
  • Schema對名稱空間的支援非常好,DTD就不支援。
  • Schema比DTD支援的資料型別更多,包括自定義資料型別。
  • Schema約束能力更強大、細緻。

2.名稱空間

可以近似的看作物件呼叫該類的屬性。

使用名稱空間前應先宣告。宣告名稱空間就是在XML例項文件中為某個模式文件的名稱空間指定一個臨時的簡寫名稱。以xmlns或xmlns:作為字首。

3.引入Schema文件

(1)使用名稱空間引入XML Schema文件

<?xml version="1.0" encoding="UTF-8"?>
<書架 xmlns="http://www.it315.org/xmlbook/schema"   <!--規定預設空間-->
      xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"  <!---->
      xsi:schemaLocation="http://www. it315.org/xmlbook/schema   <!--名稱空間-->
                          http://www. it315.org/xmlbook.xsd" >    <!--Schema檔案的url-->
 
<書>
    <書名>JavaScript網頁開發</書名>
    <作者>張孝祥</作者>
    <售價>28.00元</售價>
</書>
</書架>

xsi:schemaLocation屬性在標準名稱空間"http://www. w3.org/2001/XMLSchema-instance"中定義的,

(2)不使用名稱空間來引入XML Schema文件

還可以通過xsi:noNamespaceSchemalocation屬性引屬性直接指定,noNamespaceSchemalocation屬性也是在標準名稱空間"http://www. w3.org/2001/XMLSchema-instance"的,它用於定義指定文件的位置。

<?xml version="1.0" encoding="UTF-8"?>
<書架 xmlns:xsi="http:/ /www. w3. org/2001/XMLSchema- instance"
      xsi :noNamespaceSchemaLocation=" xmlbook.xsd">
<書>
    <書名>JavaScript網頁開發</書名>
    <作者>張孝祥</作者>
    <售價>28.00元</售價>
</書>
</書架>

4.Schema語法

(1)元素定義

宣告一個元素

<xs:element name="xxx" type="xxx">

type指元素型別:

  • xs:string 字串
  • xs:decimal 小數
  • xs:integer 整數
  • xs:boolean 布林型別
  • xs:date 日期型別
  • xs:time 時間型別
<lastname> Smith</lastname>
<age>28</age>
<dateborn>1980-03-27</dateborn>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs: integer"/>
<xs:element name="dateborn" type="xs :date"/>

(2)屬性的定義

<xs:attribute name="xxx" type="xxx">
<lastname lang="En"> Smith</lastname>

<xs: attribute name="lang" type="xs:string">

(3)簡單型別

1 ) xs:minInclusive和xs:maxInclusive元素對值的限定

<xs:element name="age">
    <xs:simpleType>
        <xs:restriction base="xs :integer">
            <xs:minInclusive value="18" />
            <xs:maxInclusive value="58" />
       </xs:restriction>
    </xs:simpleType>
</xs:element>

2) xs.enumeration元素對組值的限定(列舉列出取值範圍)

<xs:element name="car">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="Audi"/>
            <xs:enumeration value="Golf"/>
            <xs:enumeration value="BMW"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

3) XS:pattern元素對一系列值的限定

<xs:element name="letter">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:pattern value="[a-z]"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

4) xstestriction元素對空白字元的限定

在XML文件中,空白字元比較特殊,如果需要對空白字元(Witepaice Caraces)進行處理,可以使用WhiteSpace元素。whiteSpace 元素有3個屬性值可以設定,分別是preserve、replace和collapse。其中,preserve 表示不對元素中的任何空白字元進行處理,replace 表示移除所有的空白字元, collapse表示將所有的空白字元縮減為一個單一字元。

<xs:element name="address">
    <xs:simpleType>
        <xs:restriction base= "xs:string">
            <xs:whiteSpace value="preserve"/>
        </xs:restriction>
    </xssimpleType>
</xs:element>

(4)複雜型別

<xs:complexType></xs:complexType>

1)空元素<xs:complexType></xs:complexType>

2)包含其他元素的元素<xs:complexType><sequence></sequence></xs:complexType>

3)僅包含文字的元素

4)包含元素和文字的元素<xs:complexType mixed="ture"><sequence></sequence></xs:complexType>