zoukankan      html  css  js  c++  java
  • 每天多一点之DTD

    1、DTD基本概念:

    DTD ( document type definition 文档类型定义),该文件一般和xml文件配合使用, 主要的用处是约束 xml, 除了dtd 技术外,

    还有一个schema的技术也可以用于约束xml文件的书写规范.

    2、基本语法:

    <!ELEMENT 元素名 类型>

    类型:

    EMPTY-该元素不能包含子元素和文本,但可以有属性-(空元素)

    ANY-该元素可以包含任何在DTD中定义的元素内容

    #PCDATA-可以包含任何字符数据,但是不能在其中包含任何子元素

    其它类型(组合)

     

    空元素:

    <!ELEMENT 元素名称 EMPTY>
    例子:
    <!ELEMENT br EMPTY>
    XML例子:
    <br />

    带有任何内容的元素:

         通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

    <!ELEMENT 元素名称 ANY>
    例子:
    <!ELEMENT note ANY>

    PCDATA :

    只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

    <!ELEMENT 元素名称 (#PCDATA)>
    例子:
    <!ELEMENT from (#PCDATA)>

    <!ELEMENT 元素名称 (元素内容)>
    image

    带有子元素(序列)的元素

        带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

      <!ELEMENT 元素名称 (子元素名称 1)>

        或者

      <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
    例子:
    <!ELEMENT note (to,from,heading,body)>

         当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,

         子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:

    <!ELEMENT note (to,from,heading,body)>
       <!ELEMENT to      (#PCDATA)>
       <!ELEMENT from    (#PCDATA)>
       <!ELEMENT heading (#PCDATA)>
       <!ELEMENT body    (#PCDATA)>
     

    声明只出现一次的元素:
    <!ELEMENT 元素名称 (子元素名称)>
    例子:
    <!ELEMENT note (message)>

        上面的例子声明了:message 子元素必须出现一次,并且必须只在 "note" 元素中出现一次。

    声明最少出现一次的元素

    <!ELEMENT 元素名称 (子元素名称+)>
    例子:
    <!ELEMENT note (message+)>

        上面的例子中的加号声明了:message 子元素必须在 "note" 元素内出现至少一次。

    声明出现零次或多次的元素

    <!ELEMENT 元素名称 (子元素名称*)>
    例子:
    <!ELEMENT note (message*)>

        上面的例子中的星号声明了:子元素 message 可在 "note" 元素内出现零次或多次。

    声明出现零次或一次的元素

    <!ELEMENT 元素名称 (子元素名称?)>
    例子:
    <!ELEMENT note (message?)>

        上面的例子中的问号声明了:子元素 message 可在 "note" 元素内出现零次或一次。

    声明“非.../既...”类型的内容

    例子:
    <!ELEMENT note (to,from,header,(message|body))>

        上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。

    声明混合型的内容

    例子:
    <!ELEMENT note (#PCDATA|to|from|header|message)*>

        上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

     

    声明属性

    1、属性声明拥使用下列语法:

    <!ATTLIST 元素名称 属性名称 属性类型 默认值>
    image
    :以ID为类型的属性值,不能重复.

               实体(ENTITY):

                  引用实体

                  在 dtd 中定义:

                 <!ENTITY mycopy "我的版权">

                  在xml中引用:

                  <a>Hackerd &mycopy;</a>

                  参数实体

                 在 dtd 中定义:

                  <!ENTITY % name “姓名">

                 在dtd中引用:

                 <!ELEMENT %name; (#PCDATA)>

             

    image
     
     

    3、 DTD 的分类

    内部DTD文档

    <!DOCTYPE 根元素 [定义内容]>

    外部DTD文档

    <!DOCTYPE 根元素 SYSTEM "DTD文件路径">

    4、外部DTD文档声明的两种方式:

    •当引用的文件在本地时,采用如下方式:

        <!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">

        例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>。

    •当引用的文件是一个公共的文件时,采用如下方式:

        <!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

        例如:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

                 "http://java.sun.com/dtd/web-app_2_3.dtd">

    5、完成校验的html

    <html>
    <head>
    <!--一个简单的解析工具,去解析xml与dtd 是否匹配-->
    <script language="javascript">
    <!--
        var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
        xmldoc.validateOnParse = "true";//开启校验
        xmldoc.load("***.xml");//指定校验哪个xml文件
        document.writeln("错误代码是:"+xmlDoc.parseError.errorCode+"<br/>");  
        document.writeln("错误信息是:"+xmldoc.parseError.reason+"<br/>");  
        document.writeln("错误的行是:"+xmldoc.parseError.line);
    
    //-->
    </script>
    </head>
    <body>
    </body>
    </html>


    6、案例

    DTD(一个产品目录):


    <!
    ENTITY AUTHOR "John Doe"> <!ENTITY COMPANY "JD Power Tools, Inc."> <!ENTITY EMAIL "jd@jd-tools.com"> <!ELEMENT CATALOG (PRODUCT+)> <!ELEMENT PRODUCT (SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)> <!ATTLIST PRODUCT NAME CDATA #IMPLIED CATEGORY (HandTool|Table|Shop-Professional) "HandTool" PARTNUM CDATA #IMPLIED PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago" INVENTORY (InStock|Backordered|Discontinued) "InStock"> <!ELEMENT SPECIFICATIONS (#PCDATA)> <!ATTLIST SPECIFICATIONS WEIGHT CDATA #IMPLIED POWER CDATA #IMPLIED> <!ELEMENT OPTIONS (#PCDATA)> <!ATTLIST OPTIONS FINISH (Metal|Polished|Matte) "Matte" ADAPTER (Included|Optional|NotApplicable) "Included" CASE (HardShell|Soft|NotApplicable) "HardShell"> <!ELEMENT PRICE (#PCDATA)> <!ATTLIST PRICE MSRP CDATA #IMPLIED WHOLESALE CDATA #IMPLIED STREET CDATA #IMPLIED SHIPPING CDATA #IMPLIED> <!ELEMENT NOTES (#PCDATA)>

    XML:


    <?
    xml version="1.0" encoding="utf-8"?> <!DOCTYPE CATALOG SYSTEM 'product.dtd'> <CATALOG> <PRODUCT NAME="康师傅矿泉水" CATEGORY="HandTool" PARTNUM="abc" PLANT="Milwaukee" INVENTORY="Backordered"> <SPECIFICATIONS WEIGHT="800" POWER="600" >这里是细节</SPECIFICATIONS> <PRICE>110</PRICE> </PRODUCT> </CATALOG>
  • 相关阅读:
    nodejs向远程服务器发送post请求----融云Web SDK/客户端获取token
    Oauth2.0认证---授权码模式
    AngularJS---自定义指令
    Leetcode160-Intersection of Two Linked Lists-Easy
    Lintcode489-Convert Array List to Linked List-Easy
    Lintcode228-Middle of Linked List-Naive
    Lintcode174-Remove Nth Node From End of List-Easy
    Lintcode225-Find Node in Linked List-Naive
    Lintcode85-Insert Node in a Binary Search Tree-Easy
    Lintcode93-Balanced Binary Tree-Easy
  • 原文地址:https://www.cnblogs.com/hackerd/p/3097493.html
Copyright © 2011-2022 走看看