【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 "[email protected]">
 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 ]>

该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>
时间: 2024-10-10 05:37:52

【PHP XML与dtd概述【完整版】】的相关文章

关于XML的DTD概述

1 DTD概述 1.1 什么是DTD DTD(Document Type Definition),文档类型定义,用来约束XML文档.或者可以把DTD理解为创建XML文档的结构!例如可以用DTD要求XML文档的根元素名为<students>,<students>中可以有1~N个<student>,<student>子元素为<name>.<age>和<sex>,<student>元素还有number属性. DTD不

xml笔记之完整版(一)

xml笔记之完整版(一) 好记性不如烂笔头,边学边忘记的我不得不承认,笔记是如此重要.最近学习了XML需要做个笔记,以便日后查看.xml的内容其实并不多,但是之前从未系统进行学习,以至于望而生畏.所以最近系统学习了一下,做个总结. xml内容大致以下方面 1.XML及其语法. 2.XML约束之DTD   XML约束之Schema (两种约束). 3.XML编程(CRUD---Create Read Update Delete). 4.三种xml 解析器 dom sax Dom4j. 依次进行讲述

【甘道夫】HBase基本数据操作详解【完整版,绝对精品】

引言 之前详细写了一篇HBase过滤器的文章,今天把基础的表和数据相关操作补上. 本文档参考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 所有代码均基于"hbase 0.96.2-hadoop2"版本编写,均实测通过. 欢迎转载,请注明来源: http://blog.csdn.net/u010967382/article/details/37878701 概述 对于建表,和RDBMS类似,HBase也有namespace的概念,可以指定表空

【电子书下载】《Android应用程序开发与典型案例》完整版!!

图书简介: <android应用程序开发与典型案例>共23章,内容包含两大部分.第一部分是android程序设计基础,在介绍android环境搭建以及android系统基本控件和组件后,详细介绍了android系统应用编程中典型的技术,比如,android中的图形图像.多媒体编程.gps定位与地图编程等:第二部分是android程序ui设计,从手机软件的交互设计谈起,介绍了android用户界面设计原则和方法.android用户界面设计哲学等,并给出了具体建议. <android应用程序

【甘道夫】Hadoop2.2.0 NN HA详细配置+Client透明性试验【完整版】

引言: 前面转载过一篇团队兄弟[伊利丹]写的NN HA实验记录,我也基于他的环境实验了NN HA对于Client的透明性. 本篇文章记录的是亲自配置NN HA的详细全过程,以及全面测试HA对客户端访问透明性的全过程,希望对大家有帮助. 实验环境: Hadoop2.2.0的4节点集群,ZK节点3个(ZK节点数最好为奇数个),hosts文件和各节点角色分配如下: hosts: 192.168.66.91 master 192.168.66.92 slave1 192.168.66.93 slave2

微信公众平台开发接口PHP SDK完整版

原文:微信公众平台开发接口PHP SDK完整版 官方提供的SDK只有一个文本消息功能,我们将所有消息的消息类型及事件响应都整理了进来,并且加入日志记录,代码如下: 更新日志: 2013-01-01 版本1.02014-03-15 增加图片.视频.语音的内容回复2014-04-09 增加菜单链接事件2014-04-10 修改文本回复的判定方法2014-05-20 增加高级群发消息通知事件2014-05-26 增加多客服消息及多客服的判定方法2014-05-27 修改自动回复判定方式2014-06-

CAD CAM CAE自学手册 ANSYS 15.0有限元分析自学手册_完整版PDF电子书下载

CAD CAM CAE自学手册  ANSYS 15.0有限元分析自学手册_2015.10_P523_完整版PDF电子书下载 带索引书签目录高清版_13818745 下载链接http://pan.baidu.com/s/1kUH24Rl [作 者]李津编著 [丛书名]CAD/CAM/CAE自学手册 [形态项] 523 [出版项] 北京:人民邮电出版社 , 2015.10 [ISBN号]978-7-115-27588-2 [中图法分类号]O241.82-39 [原书定价]69.00 [主题词]有限元

Java多线程完整版基础知识

Java多线程完整版基础知识 (翟开顺由厚到薄系列) 1.前言 线程是现代操作系统中一个很重要的概念,多线程功能很强大,java语言对线程提供了很好的支持,我们可以使用java提供的thread类很容易的创建多个线程.线程很不难,我对之前学习过的基础,在这做了一个整理,本文主要参考的是Java研究组织出版的j2se进阶和张孝祥-java就业培训教材这两本书 2.概述 2.1线程是什么 主要是线程与进程的区别,这里不再阐述,自行网上搜索 为什么使用线程:操作系统切换多个线程要比调度进程在速度上快很

Android照片墙完整版,完美结合LruCache和DiskLruCache

转载地址:http://blog.csdn.net/guolin_blog/article/details/34093441#comments 在上一篇文章当中,我们学习了DiskLruCache的概念和基本用法,但仅仅是掌握理论知识显然是不够的,那么本篇文章我们就来继续进阶一下,看一看在实战当中应该怎样合理使用DiskLruCache.还不熟悉DiskLruCache用法的朋友可以先去参考我的上一篇文章 Android DiskLruCache完全解析,硬盘缓存的最佳方案 . 其实,在真正的项