zoukankan      html  css  js  c++  java
  • 【PHP XML与dtd概述【完整版】】

    一、XML文件简介

    关于XML的大多数人都知道一些,HTML->xhtml->xml,这个顺序本来应当是HTML发展的顺序。

    XML可以当做配置文件使用,还可以充当小型的数据库。

    version:文档符合xml1.0规范,我们学习的一般都是1.0
    encoding:文档字符编码,比如gb2312,一般使用utf-8
    standalone:文档定义是否独立使用
    standalone="yes",表名文档独立使用
    standalone="no":默认

    XML文档有且必须仅有一个根元素

    根元素定义:
    一个完全包含文档中其他所有元素的元素
    根元素的其实标记要放在所有其他元素的起始标记之前
    根元素的结束标记要放在所有其他元素的结束标记之后。

    元素、标签、节点指的是同一个东西,在XML文件编程的时候,我们统一使用节点这个名称,这样显得更专业~

    另外,如果标签中间没有内容,就是用但标签来表示,比如<name/>

    PHP在解析XML文件的时候有时候会认为有换行符,当做内容的一部分,所以开始标签和结束标签最好在同一行。

    <name>宋江</name>

    <name>

    宋江

    </name>

    并不等价。

    XML命名规范:
    1.标签区分大小写。
    2.不能以数字或者下划线打头
    3.不能包含空格
    4名称中间不能包含冒号:

    XML文件的注释使用HTML文件中的注释方法。

    XML文件中的属性值要用双引号包起来。

    二、dtd文件概述。

    dtd概念:

    在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,称之为XML约束,dtd是约束XML文件书写规范的一种约束。

    PHP中比较重要的两种约束:dtd约束、schema约束。

    dtd约束XML文件的必要性:

    举例说明:

    XML文件中现在有结点person,但是里面除了有<name>、<age>之外,还有<除毛净重><面积>,这就不合理了。

    dtd不仅可以约束XML,还可以约束xhtml、HTML等

    dtd文档的格式详解:

    基本语法:<!ELEMENT NAME CONTENT>

    ELEMENT是关键字,NAME是元素名称,CONTENT是元素类型

    CONTENT的类型有以下几种:
    EMPTY:该元素不能包含子元素和文本,但可以有属性(空元素)
    ANY:该元素可以包含任何在DTD中定义的元素内容
    #PCDATA:可以包含任何字符数据,但是不能在其中包含任何子元素
    其他类型:以上三种类型的组合

    简单dtd文件示例:

    1 <!ELEMENT 班级(学生+)>//代表根节点班级至少需要有一个学生节点
    2 <!ELEMENT 学生(名字,年龄,介绍)>//学生标签中可以使用的标签有名字、年龄、介绍
    3 <!ELEMENT 介绍(#PCDATA)>//介绍标签中的内容只能是字符类型,即文本类型,不能再嵌套其它标签

    组合示例:

    1 <!ELEMENT 班级(班长?,组长*,学生+)>
    2 //表示班级中只有一个班长,可以有组长(没有或者多个),至少有一个学生

    通配符讲解:

    +表示1-n,*表示0-n;n>=1
    ?表示只能出现一次,就是说只能出现一次或者0次
    ()用来给元素分组
    |用来选择符号
    ,是顺序符号,控制xml文件的书写顺序。

    dtd文件属性定义:

    属性定义语法:

    <!ATTLIST 元素名称
    属性名字 属性类型 属性特点
    属性名字 属性类型 属性特点
    >

    属性类型有:

    CDATA:表示属性值可以是字符或者数字
    ID:代表属性的值是唯一的,并且要以字母开头
    IDREF/IDREFS:id引用,引用类型的;属性值要在xml文档中有定义,前者只可以引用一个,后者可以引用多个,之间用空格隔开
    Emumerated:枚举类型,顾名思义,如性别,只能是男和女

    ENTITY/ENTITIES:前者是引用实体,后者是参数实体

    属性特点有以下几种:

    #REQUIRED :该属性必须有
    #IMPLIED :该属性可以有也可以没有
    #FIXED value :该属性的值是固定值
    DEFAULT value:默认值,如果没有给属性值

    举例:

    举例:婚姻状态  (单身|已婚|离婚)   #REQUIRED:表示婚姻状态属性必须从单身、已婚、离婚中选择一个,而且必须有此属性

    引用实体用法:

    <!ENTITY 实体名 "内容">
    在xml文件中使用的时候:&实体名;

    参数实体用法:

    <!ENTITIES % 实体名称 实体内容>
    在dtd文件中使用:%实体名称;

    四、XML引入dtd约束

    dtd分为内部dtd和外部dtd

    内部dtd:将dtd的定义写在XML文件中

    外部dtd:将的dtd单独写在一个dtd文件中,将之引入XML文件中。

    引入dtd语法格式:

    内部dtd的格式:<!DOCTYPE 根元素 [定义内容]>
    外部dtd文档:<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
    内外部DTD文档结合:<!DOCTYPE 根元素 SYSTEM "DTD文件路径"[定义内容]>

    注意:当引用的文件是一个公共的文档的时候,采用如下方式:
    <!DOCTYPE 文档根结点 PUBLIC "DTD名称" “DTD文件的URL”>

    复杂dtd综合案例:

    产品目录dtd

     1 <!DOCTYPE CATALOG [
     2 
     3 <!ENTITY AUTHOR "John Doe">
     4 <!ENTITY COMPANY "JD Power Tools, Inc.">
     5 <!ENTITY EMAIL "jd@jd-tools.com">
     6 
     7 <!ELEMENT CATALOG (PRODUCT+)>
     8 
     9 <!ELEMENT PRODUCT
    10 (SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
    11 <!ATTLIST PRODUCT
    12 NAME CDATA #IMPLIED
    13 CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
    14 PARTNUM CDATA #IMPLIED
    15 PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
    16 INVENTORY (InStock|Backordered|Discontinued) "InStock">
    17 
    18 <!ELEMENT SPECIFICATIONS (#PCDATA)>
    19 <!ATTLIST SPECIFICATIONS
    20 WEIGHT CDATA #IMPLIED
    21 POWER CDATA #IMPLIED>
    22 
    23 <!ELEMENT OPTIONS (#PCDATA)>
    24 <!ATTLIST OPTIONS
    25 FINISH (Metal|Polished|Matte) "Matte" 
    26 ADAPTER (Included|Optional|NotApplicable) "Included"
    27 CASE (HardShell|Soft|NotApplicable) "HardShell">
    28 
    29 <!ELEMENT PRICE (#PCDATA)>
    30 <!ATTLIST PRICE
    31 MSRP CDATA #IMPLIED
    32 WHOLESALE CDATA #IMPLIED
    33 STREET CDATA #IMPLIED
    34 SHIPPING CDATA #IMPLIED>
    35 
    36 <!ELEMENT NOTES (#PCDATA)>
    37 
    38 ]>
    View Code

    该dtd我们首先可以看出是一个内部dtd,其次,我们可以看出,该dtd每定义完一个节点,都紧接着在后面将该节点的属性列出来,这是一种良好的书写规范。

    学习PHP对dtd的要求就是能看懂以上的dtd文档,并要求根据dtd文件写出相应的XML文件。并不要求会写dtd,因为那是项目经理干的事情。

    五、使用js验证XML文件的规范性。

    由于浏览器默认不会验证XML文件是否满足的dtd文档的约束条件,所以我们需要自己写代码验证,为此,IE5.0以上的版本均提供了XML解析工具:Microsoft.XMLDom,开发人员可以编写js代码,利用这个解析工具装载XML文件,并对XML文件进行dtd验证。

    实例代码:

    dtd_control.dtd文档内容如下:

    1 <!ELEMENT person (student+,moniter?)>
    2 <!ELEMENT student (name,age,sex)>
    3 <!ELEMENT age (#PCDATA)>
    4 <!ELEMENT name (#PCDATA)>
    5 <!ELEMENT sex (#PCDATA)>
    6 <!ELEMENT moniter (name,age,sex)>

    Person.xml文件内容如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!DOCTYPE person SYSTEM "dtd_control.dtd">
     3 <person>
     4     <student>
     5         <name>张三</name>
     6         <age>16</age>
     7         <sex></sex>
     8     </student>
     9     <student>
    10         <name>张燕</name>
    11         <age>17</age>
    12         <sex></sex>
    13     </student>
    14     <moniter>
    15         <name>赵六</name>
    16         <age>20</age>
    17         <sex></sex>
    18     </moniter>
    19 </person>

    js_text.html文件:网页中嵌入js代码进行测试,用浏览器打开此文件进行dtd文件的验证,这些代码不需要记住,只需会用即可。

     1 <html>
     2 <head>
     3 <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
     4 </head>
     5 <script language="javascript">
     6 //从语法上分析:parse 
     7 //1.创建xml文档解析器对象
     8 var xmldoc =new ActiveXObject("Microsoft.XMLDOM");
     9 //2.开启xml校验
    10 xmldoc.validateOnParse="true";
    11 //3.装载xml文档
    12 xmldoc.load("Person.xml");
    13 //4.获取错误信息
    14 var result=xmldoc.parseError.reason;
    15 if(result!="")
    16 {
    17     document.write("错误信息:"+xmldoc.parseError.reason+"<br/>");
    18     document.write("错误行数:"+xmldoc.parseError.line+"<br/>");
    19 }
    20 else
    21 {
    22     document.write("无错误信息!");
    23 }
    24 </script>
    25 </html>
  • 相关阅读:
    菜鸟刷题路:剑指 Offer 09. 用两个栈实现队列
    python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
    python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))
    python 全栈开发,Day38(在python程序中的进程操作,multiprocess.Process模块)
    python 全栈开发,Day37(操作系统的发展史)
    python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)
    python 全栈开发,Day35(TCP协议 粘包现象 和解决方案)
    python 全栈开发,Day34(基于UDP协议的socket)
    python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)
    python 全栈开发,Day32(知识回顾,网络编程基础)
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/3969711.html
Copyright © 2011-2022 走看看