【转载】XML DTD和XML Schema
前端之家收集整理的这篇文章主要介绍了
【转载】XML DTD和XML Schema,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
原文地址:http://blog.csdn.net/sunxing007/article/details/5684265
每天都在用xml,可是却一直没有去深入了解一下DTD和Schama,当然我觉得很大一个原因是因为不需要,本人从事web开发3年多也只有一次修改DTD文件的机会.周末无意间翻看了一下张孝祥的书,再到w3school上读了两边,总算略知一二,关键点记录下来,以为纪念.
简单的说,DTD和Schema都是用来描述xml文档结构,限定文档的数据类型的. 只是做法上不一样. 想象一下一个xml 文档无非就是元素的集合,元素可嵌套,元素可以有属性. 那么DTD或schema就是用来描述一个xml文档可以出现哪些元素,每个元素都可以有什么属性,每个元素都可以有哪些嵌套元素,元素可去什么数据类型,以及元素的顺序,重复的次数等等.下面分别记录DTD和Schema的要点.
DTD:
1 DTD可以嵌入在XML文档中.如下面的例子:
- <?xmlversion="1.0"?>
- <!DOCTYPEnote[
- <!ELEMENTnote(to,from,heading,body)>
- <!ELEMENTto(#PCDATA)>
- <!ELEMENTfrom(#PCDATA) <!ELEMENTheading(#PCDATA) <!ELEMENTbody(#PCDATA) ]<note to>George</from>Johnheading>Reminderbody>Don'tforgetthemeeting!>
2 DTD也可以独立的放在一个文件中. 如servlet2.3的部署描述
文件xml,dtd
文件引用了一个网络资源
文件:
xmlversion="1.0"encoding="UTF-8" <!DOCTYPEweb-appPUBLIC
- "-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd"web-app ...
- >
当然DTD文件也可以放在本地,需要注意的是两者DOCTYPE的声明的不同:
<!DOCTYPEnoteSYSTEM"note.dtd"
- >
3 一个XML文档由以下模块构成:
@H_
301_205@元素 即一个节点
@H_
301_205@
属性 提供有关元素的额外信息
@H_
301_205@实体 预定义的普通文本变量
@H_
301_205@PCDATA 会被解析器解析的文本,这些文本将被解析器检查实体以及
标记
@H_
301_205@CDATA 是不会被解析器解析的文本
则DTD分别用ELEMENT,ATTLIST,ENTITY,#PCDATA,#CDATA来描述.
4 关于ELEMENT:
<!ELEMENT 元素名称 EMPTY> 描述空元素(没有子节点和属性的元素),如<!ELEMENT br EMPTY>.
<!ELEMENT 元素名称 (#PCDATA)> 描述只有PCDATA的元素,如前面提到的<!ELEMENT from (#PCDATA)>.
<!ELEMENT 元素名称 ANY> 描述可包含任何可解析数据的组合. 不常用.
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)> 描述元素包含的子元素序列.
如:<!ELEMENT note (to,body)>.
当然可以限定元素出现的次数.如web-app_2_3.dtd:
<!ELEMENT web-app (icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,istener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-env-ref*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)>
也可以描述"或"关系:<!ELEMENT note (to,header,(message|body))> 即"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,但 "message" 元素和 "body" 元素只能出现一个.
5 关于ATTLIST:
<!ATTLIST 元素名称 属性名称 属性类型 默认值> 声明元素拥有的属性.
<payment type="check" />对应的DTD描述: <!ATTLIST payment type CDATA "check">.
以下是属性类型的选项:
类型 |
描述 |
CDATA |
值为字符数据 (character data) |
(en1|en2|..) |
此值是枚举列表中的一个值 |
ID |
值为唯一的 id |
IDREF |
值为另外一个元素的 id |
IDREFS |
值为其他 id 的列表 |
NMTOKEN |
值为合法的 XML 名称 |
NMTOKENS |
值为合法的 XML 名称的列表 |
ENTITY |
值是一个实体 |
ENTITIES |
值是一个实体列表 |
NOTATION |
此值是符号的名称 |
xml: |
值是一个预定义的 XML 值 |
默认值参数可使用下列值:
如:<!ATTLIST contact fax CDATA #IMPLIED>,则<contact fax="555-667788" />是合法的.
属性值可枚举:
<!ATTLIST 元素名称 属性名称 (en1|en2|..) 默认值>,如:
<!ATTLIST payment type (check|cash) "cash">
6 关于实体
<!ENTITY 实体名称 "实体的值">,如:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
则在xml中可以这样引用它们:
<author>&writer;©right;</author>
预定义的实体:
实体引用 |
字符 |
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
下面是一个电视台的schedule和对应的DTD:
- xmlversion="1.0"standalone="no"?>
- <!DOCTYPEtvscheduleSYSTEM"TVSCHEDULE.dtd">
- tvschedulename="ANHUIWEISHI">
- channelchan="123"banner>BANNEL1daydate>holiday>HOLIDAYprogramslotvtr=""timetitlerating=""language="EN">12titledescriptionprogramslotchanneltvschedule>