一、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文件示例:

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

组合示例:

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

通配符讲解:

+表示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

 <!DOCTYPE CATALOG [

 <!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)> ]>

该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文档内容如下:

 <!ELEMENT person (student+,moniter?)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT moniter (name,age,sex)>

Person.xml文件内容如下:

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE person SYSTEM "dtd_control.dtd">
<person>
<student>
<name>张三</name>
<age>16</age>
<sex>男</sex>
</student>
<student>
<name>张燕</name>
<age>17</age>
<sex>女</sex>
</student>
<moniter>
<name>赵六</name>
<age>20</age>
<sex>男</sex>
</moniter>
</person>

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

 <html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<script language="javascript">
//从语法上分析:parse
//1.创建xml文档解析器对象
var xmldoc =new ActiveXObject("Microsoft.XMLDOM");
//2.开启xml校验
xmldoc.validateOnParse="true";
//3.装载xml文档
xmldoc.load("Person.xml");
//4.获取错误信息
var result=xmldoc.parseError.reason;
if(result!="")
{
document.write("错误信息:"+xmldoc.parseError.reason+"<br/>");
document.write("错误行数:"+xmldoc.parseError.line+"<br/>");
}
else
{
document.write("无错误信息!");
}
</script>
</html>

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

  1. 关于XML的DTD概述

    1 DTD概述 1.1 什么是DTD DTD(Document Type Definition),文档类型定义,用来约束XML文档.或者可以把DTD理解为创建XML文档的结构!例如可以用DTD要求XM ...

  2. python开发_xml.dom_解析XML文档_完整版_博主推荐

    在阅读之前,你需要了解一些xml.dom的一些理论知识,在这里你可以对xml.dom有一定的了解,如果你阅读完之后. 下面是我做的demo 运行效果: 解析的XML文件位置:c:\\test\\hon ...

  3. springmvc web.xml和application.xml配置详情(附:完整版pom.xml)

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...

  4. (六)mybatis-spring集成完整版

    mybatis-spring集成完整版 一.项目整体 mybatis接口层.mapper层 Service层 Test调用测试 二.自动生成代码-mybatis generator 主要修改: 接口. ...

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

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/34093441 在上一篇文章其中,我们学习了DiskLruCache的概念和基本使用 ...

  6. 免费的Lucene 原理与代码分析完整版下载

    Lucene是一个基于Java的高效的全文检索库.那么什么是全文检索,为什么需要全文检索?目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结构的 ...

  7. Asp.NET Core2.0 项目实战入门视频课程_完整版

    END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...

  8. spring aop中pointcut表达式完整版

    spring aop中pointcut表达式完整版 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @with ...

  9. Android学习之基础知识十三 — 四大组件之服务详解第二讲(完整版的下载示例)

    上一讲学习了很多关于服务的使用技巧,但是当在真正的项目里需要用到服务的时候,可能还会有一些棘手的问题让你不知所措.接下来就来综合运用一下,尝试实现一下在服务中经常会使用到的功能——下载. 在这一讲我们 ...

随机推荐

  1. opencv中的视频的读入

    #include"stdafx.h"#include"opencv2/opencv.hpp" using namespace cv;int g_slider_p ...

  2. mysql根据汉字拼音排序查询

    例如现在有一张数据表label,字段为id.name,此表的字符集设置为gb2312,以gb2312_chinese_ci整理. 设置InnoDB引擎的字符集也为简体中文,且整理为gb2312_chi ...

  3. 一个很详细的web.xml讲解

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "- ...

  4. POJ 1308

    http://poj.org/problem?id=1308 题意:判断这是不是一棵树. 思路:这个题还是有部分坑点的.首先空树也是一棵树,还有森林不是树. 关于森林的判断我是利用并查集把每一个点压缩 ...

  5. Linux之图形化shell------dialog

    转自:Linux dialog详解(图形化shell) | 运维生存时间 对话 UNIX: 使用 shell 脚本创建好的图形应用程序---http://www.ibm.com/developerwo ...

  6. ios 汉字字符串数组拼音排序

    ios没有提供简单的汉字拼音排序方法,在网上看到了oc方法,这里写以下对应的swift方法 var stringCompareBlock: (String,String)->Bool = { ( ...

  7. UIImage 在某些控件上被放大问题

    今天用到了UISlider,想利用slider.setThumbImage(UIImage(named:"aaa"), forState: UIControlState.Norma ...

  8. pfsense 企业应用实例

    从萌生更换公司网关的想法,到选择.测试.部署陆陆续续用时两个月有余.选择的标准是open and free.这期间不断在查阅一些资料,测试了7.8个各开源防火墙产品.这些产品中大多是基于linux,少 ...

  9. linux学习之lvm-逻辑卷管理器

    一.简介 lvm即逻辑卷管理器(logical volume manager),它是linux环境下对磁盘分区进行管理的一种机制.lvm是建立在硬盘和分区之上的一个逻辑层,来提高分区管理的灵活性.它是 ...

  10. ACM/ICPC 之 拓扑排序范例(POJ1094-POJ2585)

    两道拓扑排序问题的范例,用拓扑排序解决的实质是一个单向关系问题 POJ1094(ZOJ1060)-Sortng It All Out 题意简单,但需要考虑的地方很多,因此很容易将code写繁琐了,会给 ...