目录
本章来介绍一下,什么是XML,什么是DTD,还有一个跟DTD作用一样的Schema,以及为什么要学习这些东西,学习这两些东西的目的是什么。
1. 这些都是什么?为什么要学?目的是什么?
XML : 指可扩展标记语言(eXtensible Markup Language), 被设计用来传输和存储数据。是各种应用程序之间进行数据传输的最常用的工具。
XML提供了一套夸平台,跨网络,跨应用程序的语言的描述方式。使用XML可以方便的实现数据交换,系统配置,内容管理等。但是现在比较很少用XML来进行数据交互了,而是用JSON比较多了,因为JSON传输的体积要比XML小很多,更容易传输。
这也是我们经常会碰到的一个文件,而且很多开源的工具也是用到XML,所以你必须对其有跟多的了解。
Schema : Schema是对XML文档结构的定义和描述,其主要的作用是用来约束XML文件,并验证XML文件有效性。DTD的作用是定义XML的合法构建模块,它使用一系列的合法元素来定义文档结构。它们之间的区别有下面几点:
1、Schema本身也是XML文档,DTD定义跟XML没有什么关系,Schema在理解和实际应用有很多的好处。
2、DTD文档的结构是“平铺型”的,如果定义复杂的XML文档,很难把握各元素之间的嵌套关系;Schema文档结构性强,各元素之间的嵌套关系非常直观。
3、DTD只能指定元素含有文本,不能定义元素文本的具体类型,如字符型、整型、日期型、自定义类型等。Schema在这方面比DTD强大。
4、Schema支持元素节点顺序的描述,DTD没有提供无序情况的描述,要定义无序必需穷举排列的所有情况。Schema可以利用xs:all来表示无序的情况。
5、对命名空间的支持。DTD无法利用XML的命名空间,Schema很好满足命名空间。并且,Schema还提供了include和import两种引用命名空间的方法。
DTD : 文档类型定义(Document Type Definition)是一套关于标记符的语法规则。
这个文件主要的功能是验证XML文件编写的合法性,也就是一个约束,要求你只能按DTD定义的格式写。dtd是一种XML的约束,说白了就是我定义了dtd文件,下面的xml编写必须按照我的约束条件来写。
本章内容主要介绍一下DTD,原因很简单,就是因为简单。
2.标准的XML格式
1) 有且只有一个根元素
2) XML标签区分大小写
3) 正确的使用结束标签
4) 正确的嵌套标签
5) 使用合法的标签名
6) 定义有效的属性
3.DTD
DTD主要分为内部定义和外部定义:
3.1 内部DTD的定义,需要在顶部加入,语法如下:
<!DOCTYPE 根节点[需要定义的元素和元素属性]>
元素名称:是自定义的名称,它用于定义被约束 XML 文档中的元素。
元素内容:是对元素包含内容的声明,包括属性类型和属性描述两部分。
3.1.1 元素定义:
常用元素的分类:
语法 | 关键字 | 作用 | 示例 |
<!ELEMENT 节点名称 EMPTY> | EMPTY | 代表空元素 | <!ELEMENT br EMPTY> |
<!ELEMENT 节点名称 (#PCDATA)> | #PCDATA | 代表文本元素,里面的内容必须是文本 | <!ELEMENT name (#PCDATA)> |
<!ELEMENT 节点名称 (e1,e2)> | (e1,e2) | 代表混合元素,表示这个标签里面还有其他的节点 | <!ELEMENT person (name,age,contact,br*)> |
常用元素的限制:
与( , ) 非 ( | ) | ,可以理解成java中的逻辑运算符 &&和 || ,是并且和或者的意思 |
元素可以出现次数 | 0或1 :? 0~N : * 1~N : + |
3.1.2 属性定义:
语法
<!ATTLIST 节点名称
属性名称 属性类型 属性描述
>
示例:
<!ATTLIST action
path CDATA #REQUIRED
type CDATA #REQUIRED
>
常用属性类型:
关键字 | 作用 | 示例 |
ID | 表示名称相同的节点的这个属性值都必须唯一,不能重复 | <!ATTLIST person > |
( 值1 | 值2 ) | 表示该属性值必须是值1或者是值2 | <!ATTLIST person sex (男|女) '男' > |
CDATA | 该类型表示该属性值必须为文本类型 | <!ATTLIST person > |
IDREF | 该类型表示该属性指向另外一个同级节点,通过ID值 | 示例: <!ATTLIST person parent IDREF #IMPLIED > |
常用属性描述:
关键字 | 作用 | 示例 |
#REQUIRED | 表示该属性必填 | <!ATTLIST person > |
#IMPLIED | 表示该属性可有可无 | <!ATTLIST person > |
'默认值' | 表示如果不写该属性会默认有一个,值为'默认值' 注意:只有属性类型为( 值1 | 值2 )时,才可以使用默认值的方式 | <!ATTLIST person sex (男|女) '男' > |
3.2 外部定义
外部定义其实就是把DTD定义的代码封装到了一个DTD文件中
引用代码:
<!DOCTYPE 根节点 SYSTEM "dtd的地址">