【永恒的瞬間】
          ?Give me hapy ?

          1. DTD 簡介

          DTD(Document Type Definition) 定義了 XML 文檔的合法構造塊,他用一系列合法的元素定義文檔結構
          DTD
          可以在 XML 文檔的內部聲明,也可以外部引用

          為什么要用 DTD 呢?
          使用 DTD ,我們每個 XML 文件都可以有自己的格式描述
          使用 DTD ,獨立的組織間可以用公用的 DTD 交換數據
          在你的應用中可以用 DTD 檢驗你從外界得到的數據是否有效

          內部 DOCTYPE 聲明
          語法: <!DOCTYPE root-element [element-declarations]>

          看個例子:
          ?
          <?xml version="1.0"?>
          <!DOCTYPE note [
          ? <!ELEMENT note (to,from,heading,body)>
          ? <!ELEMENT to????? (#PCDATA)>
          ? <!ELEMENT from??? (#PCDATA)>
          ? <!ELEMENT heading (#PCDATA)>
          ? <!ELEMENT body??? (#PCDATA)>
          ]>
          <note>
          ? <to>Tove</to>
          ? <from>Jani</from>
          ? <heading>Reminder</heading>
          ? <body>Don't forget me this weekend</body>
          </note>
          ?

          !DOCTYPE note 定義了這是一個 note 類型的文檔
          !ELEMENT note
          定義 note 4 個子元素 to,from,heading,body
          !ELEMENT to
          定義 to 這個元素是 #PCDATA 類型的
          其他類似

          外部 DOCTYPE 聲明
          語法: <!DOCTYPE root-element SYSTEM "filename">

          例子:
          ?
          <?xml version="1.0"?>
          <!DOCTYPE note SYSTEM "note.dtd">
          <note>
          <to>Tove</to>
          <from>Jani</from>
          <heading>Reminder</heading>
          <body>Don't forget me this weekend!</body>
          </note>

          note.dtd:
          <!ELEMENT note (to,from,heading,body)>
          <!ELEMENT to (#PCDATA)>
          <!ELEMENT from (#PCDATA)>
          <!ELEMENT heading (#PCDATA)>
          <!ELEMENT body (#PCDATA)>
          ?

          我們已經定義了 DTD ,也按照定義寫了 XML 文檔,那如何驗證呢?下面就用 javascript 驗證一下
          先寫個錯誤的 XML ,然后用 javascript 檢驗
          ?
          note_dtd_error.xml:
          <?xml version="1.0"?>
          <!DOCTYPE note [
          ? <!ELEMENT note??? (to,from,heading,body)>
          ? <!ELEMENT to????? (#PCDATA)>
          ? <!ELEMENT from??? (#PCDATA)>
          ? <!ELEMENT heading (#PCDATA)>
          ? <!ELEMENT body??? (#PCDATA)>
          ]>
          <note>
          <to>Tove</to>
          <fromm>Jani</fromm>
          <heading>Reminder</heading>
          <body>Don't forget me this weekend!</body>
          </note>

          validate.html:
          <html>
          <body>
          <h3>
          This demonstrates a parser error:
          </h3>

          <script type="text/javascript">
          var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
          xmlDoc.async="false"
          xmlDoc.validateOnParse="true"
          xmlDoc.load("note_dtd_error.xml")

          document.write("<br />Error Code: ")
          document.write(xmlDoc.parseError.errorCode)
          document.write("<br />Error Reason: ")
          document.write(xmlDoc.parseError.reason)
          document.write("<br />Error Line: ")
          document.write(xmlDoc.parseError.line)
          </script>

          </body>
          </html>
          ?

          運行 validate.html 可以看到以下信息:
          ?
          This demonstrates a parser error:

          Error Code: -1072898028
          Error Reason:
          根據 DTD/Schema ,元素內容無效。預期 : from
          Error Line: 12
          ?

          DTD 的概貌和如何驗證已經看過了,接下來看一下 DTD 的具體語法

          2. DTD-XML 構造塊

          DTD 看來, XML 文檔都是由以下簡單的改造塊構成的:
          Elements
          Attributes
          Entities
          PCDATA
          CDATA

          Elements
          Elements
          是主要的構造塊,可以包含文本,其他元素,或者為空,如
          ?<message>some message in between</message>?

          Attributes
          Attributes
          Elements 提供額外信息,他總是在 Elements 的起始標簽中,總是以 name/value 出現

          Entities
          Entities
          是用語定義通用文本的變量, Entities XML 文檔被解析時被展開,下面的是 XML 預定義的實體:

          &lt;????????? <?
          &gt;???????? >?
          &amp;????? &?
          &quot;????? "?
          &apos;???? '?


          PCDATA
          PCDATA
          是字符數據,是會被解析的文本,文本中的 tags 會被當作標記處理, entities 會被展開

          CDATA
          CDATA
          也是字符數據,但他是不會被解析的文本,文本中的 tags 不會被當作標記處理, entities 也不會被展開

          3. Elements

          (1) 聲明一個 Element ,語法:
          ?
          <!ELEMENT element-name category>
          or
          <!ELEMENT element-name (element-content)>
          ?

          (2)Empty elements, 用關鍵字 EMPTY 來聲明
          ?
          <!ELEMENT element-name EMPTY>

          example:
          <!ELEMENT br EMPTY>

          XML example:
          <br />
          ?

          (3)Elements 只包含字符數據時,用 #PCDATA? 來聲明
          ?
          <!ELEMENT element-name (#PCDATA)>

          example:
          <!ELEMENT from (#PCDATA)>
          ?

          (4)Elements with any contents, ANY 聲明時,元素可包含任何可以被解析的數據
          ?
          <!ELEMENT element-name ANY>
          example:
          <!ELEMENT note ANY>
          ?

          (5)Elements with children (sequences)
          ?
          <!ELEMENT element-name
          ?(child-element-name)>
          or
          <!ELEMENT element-name
          ?(child-element-name,child-element-name,.....)>
          ?
          ?example:
          ?<!ELEMENT note (to,from,heading,body)>
          ?

          子元素出現的順序必須和聲明時的一致,子元素也可以有子元素

          (6) 聲明相同元素只出現一次
          ?
          <!ELEMENT element-name (child-name)>

          example:
          <!ELEMENT note (message)>
          說明 message note 中只能出現一次
          ?

          (7) 聲明相同元素至少出現一次
          ?
          <!ELEMENT element-name (child-name+)>

          example:
          <!ELEMENT note (message+)>
          "+"
          說明 message note 中至少出現一次
          ?

          (7) 聲明相同元素出現 0 次或多次
          ?
          <!ELEMENT element-name (child-name*)>

          example:
          <!ELEMENT note (message*)>
          "*"
          說明 message note 中的出現是隨意的
          ?

          (8) 聲明相同元素出現 0 次或一次
          ?
          <!ELEMENT element-name (child-name?)>

          example:
          <!ELEMENT note (message?)>
          "?"
          說明 message note 中可不出現,或者出現一次
          ?

          (9) 聲明 either/or 內容
          ?
          example:
          <!ELEMENT note (to,from,header,(message|body))>
          note
          必須包含一個 to, 一個 from, 一個 header, message body 其中之一
          ?

          (10) 聲明混合內容
          ?
          example:
          <!ELEMENT note (#PCDATA|to|from|header|message)*>
          note
          可以包含 可被解析的字符, to, from, header, message, 并且可以出現任意次
          ?

          4. Attributes

          (1) 聲明 Attributes ,語法:
          ?
          <!ATTLIST element-name attribute-name
          ?attribute-type default-value>
          ?
          ?example:
          ?DTD example:
          <!ATTLIST payment type CDATA "check">

          XML example:
          <payment type="check" />
          ?

          attribute-type 有下列值:
          CDATA???
          字符數據
          (en1|en2|..)???
          值必須是枚舉列表中的一個
          ID??? unique id
          IDREF???
          其他元素的 id
          IDREFS???
          其他 id 列表
          NMTOKEN???
          一個有效的 XML 名字
          NMTOKENS???
          有效的 XML 名列表
          ENTITY????
          一個實體
          ENTITIES???
          一個實體列表
          NOTATION???
          一個符號名
          xml:???
          一個預定義的 XML

          default-value 有下列值:
          value???
          默認值
          #REQUIRED???
          這個屬性必須出現
          #IMPLIED???
          這個屬性不是必須的
          #FIXED value???
          這個屬性的只是固定的


          (2)
          指定一個默認值屬性
          ?
          DTD:
          <!ELEMENT square EMPTY>
          <!ATTLIST square width CDATA "0">

          Valid XML:
          <square width="100" />

          square 被定義為一個空元素,他有一個 CDATA 類型的屬性 width ,如果 width 沒被指定值,那他就是 0
          ?

          (3) #IMPLIED
          語法:
          ?
          <!ATTLIST element-name attribute-name
          attribute-type #IMPLIED>

          example:
          DTD:
          <!ATTLIST contact fax CDATA #IMPLIED>

          Valid XML:
          <contact fax="555-667788" />
          Valid XML:
          <contact />
          ?

          (4) #REQUIRED
          語法:
          ?
          <!ATTLIST element-name attribute_name
          attribute-type #REQUIRED>

          Example
          DTD:
          <!ATTLIST person number CDATA #REQUIRED>

          Valid XML:
          <person number="5677" />

          Invalid XML:
          <person />
          ?

          (5) #FIXED
          語法:
          ?
          <!ATTLIST element-name attribute-name
          attribute-type #FIXED "value">

          Example
          DTD:
          <!ATTLIST sender company CDATA #FIXED "Microsoft">

          Valid XML:
          <sender company="Microsoft" /

          Invalid XML:
          <sender company="W3Schools" />
          ?

          (6) Enumerated attribute values
          ?
          <!ATTLIST element-name
          ?attribute-name (en1|en2|..) default-value>
          ?
          ?DTD example:
          <!ATTLIST payment type (check|cash) "cash">

          XML example:
          <payment type="check" />
          or
          <payment type="cash" />
          ?

          5. Entities
          Entities
          是用來為普通文本定義捷徑
          有兩種聲明方式:
          (1)
          內部聲明
          ?
          Syntax:
          <!ENTITY entity-name "entity-value">

          DTD Example:

          <!ENTITY writer "Donald Duck.">
          <!ENTITY copyright "Copyright W3Schools.">

          XML example:

          <author>&writer;&copyright;</author>
          ?

          (2) 外部聲明
          ?

          posted on 2007-01-12 19:00 ???MengChuChen 閱讀(424) 評論(0)  編輯  收藏 所屬分類: flex2.0
          主站蜘蛛池模板: 柘荣县| 铁岭县| 灵寿县| 绥滨县| 磴口县| 达孜县| 大港区| 崇明县| 厦门市| 武平县| 崇仁县| 巴东县| 梁山县| 新密市| 英山县| 民权县| 南康市| 蛟河市| 民和| 天气| 日土县| 张家港市| 拉孜县| 名山县| 阳谷县| 海原县| 肇庆市| 临洮县| 咸丰县| 黔西| 南安市| 乡城县| 中宁县| 西城区| 镇赉县| 宁城县| 娄烦县| 阿鲁科尔沁旗| 谢通门县| 河北省| 合作市|