- DTD
- schema
schema 与 DTD 的对比:
- schema符合XML的语法结构
- DOM、SAX等容易解析出XML Schema
- Schema对 名称空间 支持得比较好
- Schema支持更多的数据类型、自定义的数据类型
- 约束能力强大
- 不能像DTD一样定义实体,比DTD更复杂
DTD
Document Type Definition 全文档类型定义
book.dtd 文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 书架 (书)> //复杂标签,只能有一个根节点为书
<!ELEMENT 书 (书名,售价,作者,简介)>
<!ELEMENT 书名 (#PCDATA)> //简单标签
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<!ELEMENT 简介 (#PCDATA)>
引用DTD,如下xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--引入DTD文件-->
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>JavaWeb开发大全</书名>
<售价>g</售价>
<作者>34</作者>
<简介>不错啊</简介>
</书>
</书架>
DTD的元素定义:
<!ELEMENT 元素名称 使用规则>
使用规则如下:
使用规则 | 含义 |
---|---|
(#PCDATA) | 指示元素的主体内容只能是普通的文本.(Parsed Character Data) |
EMPTY | 用于指示元素不能包含任何子元素和文本,仅可以使用属性。比如 |
ANY | 用于指示元素的主体内容为任意类型。 |
(子元素) | 指示元素中包含的子元素 |
(子元素) | 案例 | |||
---|---|---|---|---|
逗号分开,说明必须按照声明顺序去编写XML文档 | <!ELEMENT FILE (TITLE,AUTHOR,EMAIL) | |||
用“ | ”分开,说明任选其一 | <!ELEMENT FILE (TITLE | AUTHOR | EMAIL) |
元素后面没有+*? | 表示必须且只能出现一次 | |||
元素后面 + | 表示至少出现一次,一次或多次 | |||
元素后面 * | 表示可有可无,零次、一次或多次 | |||
元素后面 ? | 表示可以有也可以无,有的话只能有一次。零次或一次 |
示例
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)*| COMMENT)>
DTD属性定义
<!ATTLIST 元素名称
属性名 属性类型 约束
属性名 属性类型 约束
......
>
属性类型 | 含义 | |||
---|---|---|---|---|
CDATA | 属性的取值为普通的文本字符串 | |||
ENUMERATED | 枚举,只能从枚举列表中任选其一,如(鸡肉 | 牛肉 | 猪肉 | 鱼肉) |
ID | 属性的取值不能重复(不能只写数字) |
约束 | 含义 |
---|---|
#REQUIRED | 属性必须出现 |
#IMPLIED | 属性可有可无 |
#FIXED | 属性的取值为一个固定值。语法:#FIXED "固定值" |
直接值 | 属性的取值为该默认值 |
示例
<!ATTLIST 页面作者
姓名 CDATA #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIRED
网站职务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>
DTD 与 XML文档关联的三种方式
- 使用内部DTD 格式
- 使用外部DTD
- 使用网络DTD
<!--内部关联-->
<!DOCTYPE 根节点 [DTD的代码 ]>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
]>
<!--外部关联-->
<!DOCTYPE 根节点 SYSTEM “DTD的地址” >
<!--网络关联-->
<!DOCTYPE 根节点 PUBLIC “DTD的名称” “DTD的地址” >
示例 使用内部DTD
<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
DTD的实体定义
-
实体用于为一段内容创建一个别名,可在XML文档中引用这段内容
DTD中定义:<!ENTITY 别名 “值”> XML中引用:&别名
schame
book.xsd文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
在根节点上,使用属性xmlns(xml namespace),引入W3C的名称
属性 targetNamespace 用于指定Schame文档中声明的元素属于哪个命名空间
属性 elementFormDefault qualified 质量好的 unqualified质量不好的
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mango.cool/110" elementFormDefault="qualified">
<element name="书架">
<complexType>
<sequence>
<element name="书">
<!-- 复杂的元素 -->
<complexType>
<!-- 有顺序的 -->
<sequence>
<!-- 简单元素 -->
<element name="书名" type="string"></element>
<element name="作者" type="string"></element>
<element name="简介" type="string"></element>
</sequence>
<!-- 书的属性 -->
<attribute name="出版社" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
book.xml 文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
*引入W3C名称空间,我是实例文档
*xmlns=""
*引入自己编写的schema的文档
*xmlns=""
*问题:元素不能有相同的属性名称
*解决 :起别名 :aa
*技巧:再出现概率较小的标签上起别名
*引入自己编写的schema文档的地址
*schemalocation属性是W3C提供的,如果W3C名称空间有别名的haul,先把别名协商
-->
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.mango.cool/110"
xsi:schemaLocation="http://www.mango.cool/110 book.xsd">
<书>
<书名>JavaWeb开发大全</书名>
<作者>34</作者>
<简介>不错啊</简介>
</书>
</书架>
Schame约束,开发XML的过程
W3C预先定义元素和属性 --> schame文档 --> xml文档
名称空间的概念
每个约束文档都可以被赋予一个唯一的名称空间,名称空间用一个唯一的URI表示;尽管以http://开始,但是并不指向一个包含模式定义的文件。事实上,该url不指向任何文件,只是一个分配的名字
schema 示例 包含两个.xsd文件,一个.xml文件
company.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/company"
elementFormDefault="qualified">
<element name="company">
<complexType>
<sequence>
<element name="employee">
<complexType>
<sequence>
<!-- 引用任何一个元素 -->
<any></any>
<!-- 员工名称 -->
<element name="name">
<complexType>
<simpleContent>
<extension base="string"></extension>
</simpleContent>
<attribute name="salary" type="double"></attribute>
</complexType>
</element>
</sequence>
<!-- 为employee元素添加属性 -->
<attribute name="age" type="int"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
<company>
<employee>
<abc></abc>
</employee>
</company>
department.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/department"
elementFormDefault="qualified">
<!-- 部门名称 -->
<element name="name" type="string"></element>
</schema>
company.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 数据文件 引用多个Schema -->
<company xmlns = "http://www.example.org/company"
xmlns:dept="http://www.example.org/department"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/company company.xsd http://www.example.org/department department.xsd"
>
<employee age="30">
<!-- 部门名称 -->
<dept:name>人力资源部</dept:name>
<!-- 员工名称 -->
<name salary="3000.00">王晓晓</name>
</employee>
</company>
网友评论