一、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. windows下vim编辑器,字符编码设置。

    在windows下的vim默认字符集修改 之前使用vim编辑器的时候碰到乱码的问题,后来在网上看了记下了:在vim编辑器中按esc进入命令模式 1.修改vim内部编码    set encoding= ...

  2. Github Bash

    第一步生成密钥:ssh-keygen -C 'your@email.address' 第二步验证结果:ssh -T git@github.com 第三步克隆:git clone https://git ...

  3. Struts2中的OGNL通配符

    <action name="*_*" class="action.{1}Action" method="{2}"> 匹配,第一个 ...

  4. 1.3---字符串重新排列后是否能够变成另一个字符串(CC150)

    import java.util.*; public class Same { public boolean checkSam(String str1, String str2) { // write ...

  5. linux下git安装

    Download for Linux and Unix It is easiest to install Git on Linux using the preferred package manage ...

  6. svn update错误

    可以再checkout下来一份项目,重新命名,然后将该项目下的隐藏文件夹.svn替换掉原项目 注意备份

  7. hosts 本机DNS域名解析

    一. Hosts文件的位置很多用户都知道在Window系统中有个Hosts文件(没有后缀名),在Windows 98系统下该文件在Windows文件夹.在Windows 2000/XP系统中位于\%S ...

  8. C#错误之 System.Threading.ThreadAbortException:正在中止线程

    参考:http://www.cnblogs.com/chendaoyin/archive/2013/06/27/3159211.html 1.开启一个子线程 //开启一个子线程,子线程调用方法 Met ...

  9. 3.SpringMVC修改配置文件路径和给界面传递数据

    1.修改配置文件路径  达到  配置多文件的目的 web.xml文件中基础配置有springMVC配置的servlet路径 <servlet-name>SpringMVC</serv ...

  10. Divide and conquer:Median(POJ 3579)

        快速求两数距离的中值 题目大意:给你一个很大的数组,要你求两个数之间的距离的中值 二分法常规题,一个pos位就搞定的事情 #include <iostream> #include ...