1. 程式人生 > >2.xml約束技術----------dtd約束

2.xml約束技術----------dtd約束

data 例子 pub 直接 sch 元素 CP 下劃線 cdata

1.xml的約束

  (1)為什麽需要定義約束了

    比如現在定義一個person的xml文件,只想要這個文件裏面保存人的信息,比如name age等,但是如果在xml文件中寫了一個元素<貓>,發現可以正常顯示,因為符合語法規範。但是貓肯定不是人的信息,xml的元素時自定義的,需要技術來規定xml中只能出現的元素,這個時候就需要約束了

    xml的約束的技術:dtd約束 和 schema約束

2.dtd的編寫使用步驟(註意語法的格式,該打空格就打空格)

  (1)創建一個文件,後綴名為.dtd

  (2)在文件中寫入約束

    a.看xml中有多少個元素,有幾個元素那麽就在dtd文件中寫幾個<!ELEMENT>(大寫)

    b.判斷元素時簡單元素還是復雜元素

      - 復雜元素:由子元素( 語法:<!ELEMENT 元素名字 (子元素1,子元素2...)> )

      - 簡單元素:沒有子元素( 語法:<!ELEMENT 元素名字 (#PCDATA)> )

    c.在xml文件中引入dtd文件

      語法: <!DOCTYPE 根元素名稱 SYSTEM "dtd文件的路徑">

  (3)註意

    瀏覽器只負責檢驗xml的語法,不負責校驗約束(責校約束,我們需要以來工具,比如Eclipse MyEclipse)

實例一:按照dtd約束進行定義xml

元素

dtd約束代碼如下:

<!ELEMENT persion (name,age)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>

xml文件代碼如下(按照dtd約束)

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE persion SYSTEM "Demo1.dtd">
<persion>
    <name>張三</name>
    <age>123</
age> </persion>

瀏覽器顯示

技術分享圖片

實例二:不按照dtd約束定義xml元素

如果我們不按照dtd約束,那麽Eclipse會提示錯誤,但是在瀏覽器中運行卻可以顯示

技術分享圖片

但瀏覽器正常顯示

技術分享圖片

3.dtd的三種引入方式

  (1)使用外部的dtd文件(例如上面的實例就是使用這個方式)

    語法:<!DOCTYPE 根元素名字 SYSTEM "dtd路徑">

  (2)在xml裏面使用dtd文件

    語法:<!DOCTYPE 根元素名字 [

         <!ELEMENT persion (name,age)>

         <!ELEMENT name (#CPDATA)>

         <!ELEMENT age (#PCDATA)>

       ]>

  例如代碼如下:

<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE persion [
    <!ELEMENT persion (name,age,profession)><!--這個可寫也可不寫(最好還是寫上)-->
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT profession (student)>
    <!ELEMENT student (#PCDATA)>
]>

<persion>
    <name>張三</name>
    <age>18</age>
    <profession>
        <student>學生</student>
    </profession>
</persion>

  (3)使用網絡上面的dtd文件(別人已經定義好了的)

    語法:<!DOCTYPE 根元素 PUBLIC "dtd名字" "dtd文檔的URL">

    框架struts2就會使用配置文件,並且使用的是網絡上面的dtd文件

4.使用dtd約束定義元素

  (1)語法:<!ELEMENT 元素名 約束>

  (2)簡單元素:沒有子元素的元素

    <!ELEMENT name (#PCDATA)>

    - (#PCDATA) :表示該元素可以包含字符串數據,但是不能包含子元素

    - EMPTY:表示為空(就是沒有內容,例如<a></a>)

    - ANY :表示可以包含任意類型數據

  (2)復雜元素:

    <!ELEMENT persion (name,age)> 表示子元素只能出現一次

    <!ELEMENT persion (name+,age)> 表示name元素可以出現一次或則多次

    符號的意義:

      + :表示一次或者多次(>=1)

      ?:表示零次或者一次(==0或則==1)

      * :表示零次或者多次(>=0)

      ,:如果子元素直接用逗號分割,那麽表示子元素出現的順序

      | :如果子元素用|分割,那麽之元素只能出現其中一個

技術分享圖片

  下面是一個例子:

<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE persion [
    <!ELEMENT persion (name+,age?,(profession*|aaa))><!--這個可寫也可不寫(最好還是寫上)-->
    <!ELEMENT name EMPTY>
    <!ELEMENT age ANY>
    <!ELEMENT profession (#PCDATA)>
]>

<persion>
    <name></name>
    <name></name>
    <!-- <age>18</age>這個因為是可以定義0次也可以1次,所以註釋掉 -->
    <profession>學生1</profession>
    <profession>學生2</profession>
    <profession>學生3</profession>
</persion>

    技術分享圖片

6.使用dtd定義屬性約束(就如html中class,id等一樣)

  (1)語法:<!ATTLIST 元素名字

        屬性名字 屬性類型 屬性約束

     >

  (2)屬性的值的類型

    a.CDATA:字符串

    例如:<!ATTLIST name

         ID1 CDATA #REQUIRED

      >

    b.枚舉:表示只能在一定範圍內出現的值,但是每次只能出現其中一個

    例如:<!ATTLIST name

         ID1 (AA|BB|CC) #REQUIRED

       >

    c.ID : 屬性的值只能是字符或者下劃線開頭

    例如:<!ATTLIST name

         ID1 ID #REQUIRED

       >

  (3)屬性約束

    #REQUIRED : 屬性必須存在

    #IMPLIED : 屬性可有可無

    #FIXED : 表示一個固定值 #FIXED "AAA"(也就是屬性的值必須是AAA,不能是其他的值)

     默認值:

      例如:<!ATTLIST name

           ID1 CDATA "WWW"

         >

      如果我們在xml頁面中給這個屬性沒有賦值,那麽默認就是WWW,如果賦值了,那麽就是自己賦的值

  (4)實體

    意義:我們在寫xml的時候,元素裏面的值可以引用這個實體(也就是先在dtd文件中定義,再到xml文件中使用)

      語法:<!ENTITY TEXT "entity">----<!ENTITY 實體名 "實體值">

    調用:在元素中寫 &TEXT;

    註意:定義實體需要寫在內部的dtd裏面,如果寫在外部dtd裏面,某些瀏覽器獲取不到之個值

實例代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persion [
    <!--定義元素約束-->
    <!ELEMENT persion (name,age,profession,default,entity)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT profession (#PCDATA)>
    <!ELEMENT default (#PCDATA)>
    <!ELEMENT entity (#PCDATA)>
    
    <!--元素屬性約束-->
    <!--name的值只能是這幾個枚舉之中的一個,並且必須寫-->
    <!ATTLIST name
        ID1 (AA|BB|CC) #REQUIRED 
    >
    <!--表示屬性的值只能是字符或者下劃線開頭,並且這個屬性可寫可不寫-->
    <!ATTLIST age
        ID2 ID #IMPLIED 
    >
    <!--表示這個屬性的值只能是WWW-->
    <!ATTLIST profession
        ID3 CDATA #FIXED "WWW"  
    >
    <!--表示這個屬性的值默認是default-->
    <!ATTLIST default
        ID4 CDATA "default" 
    >
    
    <!--定義實體-->
    <!ENTITY TEXT "entity">
]>

<persion>
    <name ID1="AA"></name>
    <age ID2="_id"></age>
    <profession ID3="WWW"></profession>
    <default></default>
    <entity>&TEXT;</entity>
</persion>

技術分享圖片

2.xml約束技術----------dtd約束