目录
[XML 文档构建模块](#XML 文档构建模块)
可扩展的,因为它们由XML编写通过可扩展的Schema定义,可以:
DTD是什么?
Document Tye Definition,文档类型定义
DTD有什么用途?
它使用一系列合法的元素来定义文档的结构。
为xml文件提供语法与规则(方便数据共享,形成规则,大家读的时候都按xml文件读取)
PS:简而言之,DTD就是用来约束XML文档的,使其在一定的规范下使用,除了DTD技术外,还有Schema技术,也是用于约束XML文档的。
DTD与XML有什么联系?
DTD为XML文件提供语法与规则。我们知道XML的标记是可以自定义,每个人定义的不同,那进行数据共享的时候如何让别人看得懂呢?在编写XML的时候按照DTD来规范格式,比方说某个元素只能出现一次、各个子元素的顺序......这样形成规则,大家共享的时候都按xml文件读取
DTD原理图
外部DTD
DTD与XML的内容分别在不同的文件中:
DTD文件book.dtd:
<?xml Version="1.0" encoding="utf-8"> version:版本 encoding:文件使用的字符编码方法
<!ELEMENT 书籍列表(计算机书籍)*>
<!ELEMENT 计算机书籍(书名,价格,简要介绍)> 计算机书籍元素有3个元素:书名、价格、简要介绍
<!ELEMENT 书名(#PCDATA)> 子元素单独定义,书名元素为"#PCDATA" 类型
<!ELEMENT 价格(#PCDATA)>
<!ELEMENT 简要介绍(#PCDATA)>
使用外部DTD文件的XML文件
<?xml version="1.0" encoding="utf-8">
<!DOCTYPE 书籍列表 SYSTEM "book.dtd">
PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
XML 文档构建模块
一、元素
1、元素声明
①、有元素:
<!ELEMENT 元素名称 类别>或<!ELEMENT 元素名称 (元素内容)>
<!ELEMENT 书名(#PCDATA)>
<!ELEMENT 计算机书籍(书名,价格,简要介绍)>
②、空元素:
<!ELEMENT 元素名称 EMPTY>
DTD中:<!ELEMENT br EMPTY>
XML中:<br/>
③、ANY带有任何内容元素:
<!ELEMENT 元素名称 ANY >
DTD中:<!ELEMENT student ANY>
XML中:<student>刘伟</student>
<student><name>刘伟</name></student>
2、定义某个标签内元素个数(利用一些符号标识)
声明只出现一次的元素
<!ELEMENT 元素名(子元素名称)>
举例:<!ELEMENT 书籍列表(计算机书籍)>
声明最少出现一次的元素
<!ELEMENT 元素名(子元素名称+)>
举例:<!ELEMENT 书籍列表(计算机书籍+)>
重复元素例子:
DTD中:
<!ELEMENT 书籍列表(书名,作者+)>
<!ELEMENT 书名(#PCDATA)>
<!ELEMENT 作者(#PCDATA)>
XML中:
<书籍列表>
<计算机书籍>
<书名>J2EE教程</书名>
<作者>张三</作者>
<作者>李四</作者>
</计算机书籍>
</书籍列表>
成组元素例子:
DTD中:
<!ELEMENT 书籍列表(书名,价格)+>
<!ELEMENT 书名(#PCDATA)>
<!ELEMENT 价格(#PCDATA)>
XML中:
<书籍列表>
<计算机书籍>
<书名>J2EE教程</书名>
<价格>100</价格>
<书名>XML教程</书名>
<价格>50</价格>
</计算机书籍>
</书籍列表>
声明出现零次或多次的元素
<!ELEMENT 元素名(子元素名称*)>
举例:<!ELEMENT 书籍列表(计算机书籍*)>
声明出现零次或一次的元素
<!ELEMENT 元素名(子元素名称?)>
举例:<!ELEMENT 书籍列表(计算机书籍?)>
声明或
<!ELEMENT 元素名(子元素名称|子元素名称2)>
举例:<!ELEMENT 书籍列表(计算机书籍|文学书籍)>
声明混合型的内容
<!ELEMENT 子元素名称 (#PCDATA|子元素名称)*>
举例:<!ELEMENT 书籍列表(#PCDATA|计算机书籍)*>
PS:子元素要求顺序。
二、属性(ATTLIST)
①、语法:<!ATTLIST 元素名称 属性名称 属性类型 默认值>
DTD文件中:
<!ATTLIST payment type CDATA "cash">
XML文件中:
<payment type="cash/>或
<payment/>
②、类型
③、默认值
三、实体
- 实体是用于定义引用普通文本或特殊字符的快捷方式的变量
- 实体引用是对实体的引用
- 实体可在内部或外部进行声明
内部实体声明
<!ENTITY 实体名称 SYSTEM "URI/URL">
DTD文件中:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright jobedu.com.cn">
XML文件中:
<author>&writer;©right;</author>
外部实体声明
<!ENTITY 实体名称 "实体的值">
DTD文件中:
<!ENTITY writer SYSTEM "http://www.jobedu.com.cn/dtd/person.dtd">
XML文件中:
<author>&writer</author>
四、命名空间
在一个XML文档中,包含由多个DTD描述的元素。会出现名称冲突问题。
为了解决名称冲突问题,W3C的XML小组制定了被称为命名空间(NameSpace)的标准
前缀标识法
即在元素名和属性名前面增加一个标识,以唯一区分当前元素或属性来自哪一个DTD。
Schema是什么?
XML Schema Definitior(XSD)
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。是基于XML的DTD替代者,要比DTD更强大
描述XML文档的结构,使用XML语法,自身也是XML文件的,规定XML元素顺序等等
为什么说Schema比DTD更强大呢(进步在哪儿了)?
- XML Schema 可针对未来的需求进行扩展
- XML Schema 更完善,功能更强大
- XML Schema 基于 XML 编写
- XML Schema 支持数据类型
- XML Schema 支持命名空间
使用有什么好处吗?
不必学习新的语言
可使用XML编辑器来编辑Schema文件
可使用XML解析器来解析Schema文件
有哪些特点?
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序
- 定义子元素的数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
有哪些用途?
可保护数据通信
- 当数据从发送方被发送到接收方时,其要点是双方应有关于内容的相同的"期望值"
- 通过Schema,发送方可以用一种接收方能够明白的方式来描述数据
- 一种数据,比如"03-11-2004",在某些国家被解释为11月3日,而在另一些国家为当作3月11日
- 但是一个带有数据类型的XML元素,比如:<data type="date">2004-03-11</date>,可确保对内容一致的理解,这是因为XML的数据类型"date"要求的格式是"YYYY-MM-DD"
可扩展的,因为它们由XML编写通过可扩展的Schema定义,可以:
- 在其他Schema中重复使用您的Schema
- 创建由标准类型衍生而来的您自己的数据类型
- 在相同的文档中引用多重的Schema
如何使用Schema?
验证XML是否符合Schema
IE不能验证XML是否符合Schema
email.xsd文件中
<?xml version="1.0 encoding="UTF-8>
<schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"></xs:element>
<xs:element name="from" type="xs:string"></xs:element>
<xs:element name="title" type="xs:string"></xs:element>
<xs:element name="body" type="xs:string"></xs:element>
<xs:element name="date" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</schema>
email.xml文件中
<?xml version="1.0 encoding="UTF-8>
<email xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceShemaLocation="email.xsd">
<to>liuwei9999@163.com</to>
<from>hellokitty@163.com</from>
<title>about loving</title>
<body>I Love you forever</body>
<date>2008-11-12</date>
</email>