【转载】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文档中.如下面的例子:

[xhtml] view plain copy
  1. <?xmlversion="1.0"?>
  2. <!DOCTYPEnote[
  3. <!ELEMENTnote(to,from,heading,body)>
  4. <!ELEMENTto(#PCDATA)>
  5. <!ELEMENTfrom(#PCDATA) <!ELEMENTheading(#PCDATA) <!ELEMENTbody(#PCDATA) ]<note to>George</from>Johnheading>Reminderbody>Don'tforgetthemeeting!>

2 DTD也可以独立的放在一个文件. 如servlet2.3的部署描述文件xml,dtd文件引用了一个网络资源文件:

copy
    xmlversion="1.0"encoding="UTF-8" <!DOCTYPEweb-appPUBLIC
  1. "-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"
  2. "http://java.sun.com/dtd/web-app_2_3.dtd"web-app ...
  3. >

当然DTD文件也可以放在本地,需要注意的是两者DOCTYPE的声明的不同:

copy
    <!DOCTYPEnoteSYSTEM"note.dtd" <!--注意note.dtd要和本xml放在同目录下面-->
  1. >

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 值

默认值参数可使用下列值:

解释
属性的默认值
#required 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的

如:<!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;&copyright;</author>

预定义的实体:

实体引用 字符
&lt; <
&gt; >
&amp; &
&quot; "
&apos; '

下面是一个电视台的schedule和对应的DTD:

[xhtml] view plain copy
  1. xmlversion="1.0"standalone="no"?>
  2. <!DOCTYPEtvscheduleSYSTEM"TVSCHEDULE.dtd">
  3. tvschedulename="ANHUIWEISHI">
  4. channelchan="123"banner>BANNEL1daydate>holiday>HOLIDAYprogramslotvtr=""timetitlerating=""language="EN">12titledescriptionprogramslotchanneltvschedule>

copy
    <!ELEMENTtvschedule(channel+) <!ELEMENTchannel(banner,day+) <!ELEMENTbanner(#PCDATA) <!ELEMENTday(date,(holiday|programslot+)+) <!ELEMENTholiday(#PCDATA) <!ELEMENTdate(#PCDATA) <!ELEMENTprogramslot(time,title,description?) <!ELEMENTtime(#PCDATA) <!ELEMENTtitle(#PCDATA) <!ELEMENTdescription(#PCDATA)
  1. <!ATTLISTtvschedulenameCDATA#required <!ATTLISTchannelchanCDATA#required <!ATTLISTprogramslotvtrCDATA#IMPLIED <!ATTLISTtitleratingCDATA#IMPLIED <!ATTLISTtitlelanguageCDATA#IMPLIED>

Schema:

Schema是DTD的替代者,它比DTD可以做更多的事情:

@H_301_205@定义可出现在文档中的元素 @H_301_205@定义可出现在文档中的属性 @H_301_205@定义哪个元素是子元素 @H_301_205@定义子元素的次序 @H_301_205@定义子元素的数目 @H_301_205@定义元素是否为空,或者是否可包含文本 @H_301_205@定义元素和属性的数据类型 @H_301_205@定义元素和属性的默认值以及固定值

但是代价就是Schema比DTD更复杂.

XML Schema的引用:

copy
    note
  1. xmlns="http://www.w3school.com.cn"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.w3school.com.cn/note.xsd"
  4. >

note.xsd:

copy
    xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"
  1. targetNamespace="http://www.w3school.com.cn"
  2. xmlns="http://www.w3school.com.cn"
  3. elementFormDefault="qualified"xs:elementname="note"xs:complexTypexs:sequencexs:elementname="to"type="xs:string"/>
  4. xs:elementname="from"type="xs:string"/>
  5. xs:elementname="heading"type="xs:string"xs:elementname="body"type="xs:string"xs:elementxs:schema>

由上面的代码可见,schema文件也是一个xml.

Schema命名空间:

schema有一个非常重要的概念就是命名空间(namespace).比如在spring中使用声明式事务管理的时候,可以采用如下的配置方式为service层配置事务代理:

copy
    xmlversion="1.0"encoding="UTF-8"beansxmlns="http://www.springframework.org/schema/beans"
  1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xmlns:aop="http://www.springframework.org/schema/aop"
  3. xmlns:tx="http://www.springframework.org/schema/tx"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  5. http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  6. http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd"beanid="txManager" ......
  7. beantx:adviceid="txAdvice"transaction-manager="txManager"tx:attributestx:methodname="insert*"propagation="required"tx:methodname="update*"propagation="required"tx:methodname="delete*"propagation="required"tx:methodname="list"propagation="required"read-only="true"tx:adviceaop:configaop:pointcutid="interceptorPointCuts"
  8. expression="execution(*services.*Service(..))"aop:advisoradvice-ref="txAdvice"
  9. pointcut-ref="interceptorPointCuts"beans>

那么这里使用了tx,aop命名空间.一个xml文档可以使用多个命名空间,命名空间需要先声明,并给它取别名,然后依次给出每个命名空间的schema文件地址.如下代码解释希望可以帮助你理解上面臭长的命名空间声明:

copy
    rootxmlns="默认命名空间,它不需要取别名"
  1. xmlns:ns1别名="namespace1"
  2. xmlns:ns2别名="namespace2"
  3. xsi:schemaLocation="默认命名空间,它不需要取别名""默认命名空间的xsd文件地址"
  4. namespace1namespace1的xsd文件地址
  5. namespace2namespace2的xsd文件地址 ......
  6. root>

需要注意的是xsi命名空间几乎是必要的,因为需要用xsi:schemaLocation来申明每个命名空间的schema文件地址.

对于上面给出的note.xsd. 因为它本身也是一个xml,它要使用schema命名空间,所以它也要申明命名空间.

鉴于schema的复杂性以及现实中没有多少机会编写一个xsd文件,所以具体的关于schema的编写就不介绍了. 如有问题,请参看:http://www.w3school.com.cn/schema/index.asp

http://www.yi-look.com/

猜你在找的XML相关文章