XML文件定义约束

JavaWeb技术篇 尼古拉斯.赵四 5128℃ 0评论

今天在做Android项目的时候,用到了XML解析,服务端返回的不是JSON,而是XML,这时候就需要我们解析XML了,当然在解析XML的时候,需要了XML文件的定义结构,任何一个文件的定义都是要遵循一个规范和约束的,那么XML也不例外

XML的约束模式有两种,一种是DTD,还有一种就是Schema,我们先来说一下DTD

DTD(Document Type Definition),全称为文档类型定义,下面直接来看一下dtd文档的定义吧:

<!ENTITY 版权 "合肥师范学院">

<!ENTITY  % 类型 "CDATA">

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,价格)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 价格 (#PCDATA)>

<!ATTLIST 作者
姓名 %类型; #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIRED
网站服务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>

<!ATTLIST 书名 书本类型 (科幻|教育|人文) "科幻">

<!ATTLIST 价格 编号 ID #REQUIRED>

按照这个demo.dtd编写的demo.xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
    <书>
    	<书名 书本类型="科幻">Java就业教程</书名>
        <作者 个人爱好="上网" 网站服务="页面作者" 联系信息="&版权;">张孝祥</作者>
        <价格 编号="id">30.0</价格>
    </书>
</书架>

下面我们就来一一解释:看demo.dtd文件中的内容

<!ELEMENT 书架 (书+)>

表示定义一个“书架”的标签,在该标签下面放一本或者是多本“书”标签,(注意空格)
具体规则:

在元素内容中也可以使用+、*、?等符号表示元素出现的次数:
+: 1次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)

<!ELEMENT 书 (书名,作者,价格)>

表示定义一个 “书” 标签,在该标签下面定义了“书名”,“作者”,“价格”标签,同时这三个标签是必须出现的,而且是必须按照这个顺序来定义的,(注意空格)

具体规则:

元素内容中可以使用如下方式,描述内容的组成关系
1.用逗号分隔,表示内容的出现顺序必须与声明时一致。<!ELEMENT 书(书名,作者,价格)>
2.用|分隔,表示任选其一,即多个只能出现一个<!ELEMENT 书(书名|作者|价格)>

<!ELEMENT 书名 (#PCDATA)>

表示定义一个标签“书名”,这个标签体是文本内容,具体的可以对应demo.xml查看用法

<!ATTLIST 作者
姓名 %类型; #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIRED
网站服务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>

表示在标签 ”作者“ 中定义了姓名,年龄,联系信息,网站服务,个人爱好属性。

具体规则:

#REQUIRED:必须设置该属性
#IMPLIED:可以设置也可以不设置
#FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。但需要为该属性提供这个值
直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。

<!ATTLIST 书名 书本类型 (科幻|教育|人文) "科幻">

表示给标签 “书名” 定义了一个 “书本类型”

规则:

属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)

<!ENTITY 版权 "合肥师范学院">

<!ENTITY  % 类型 "CDATA">

定义实体:

第一种方式定义的实体是引用实体,定义的内容可以被xml文件使用,如:

<作者 个人爱好="上网" 网站服务="页面作者" 联系信息="&版权;">张孝祥</作者>

使用&符号引用,并且以分号结尾

第二种方式定义的实体是参数实体,给dtd文件本身使用的,在xml文件中,如:

姓名 %类型; #IMPLIED

 

最后来说一下,在xml中需要引用dtd文件:

<!DOCTYPE 书架 SYSTEM "book.dtd">

以上说到的内容就是怎么编写dtd约束文档,以及通过dtd约束文档来编写相应的xml文件。其实struts就是用dtd约束的,可以到struts压缩包中可以看到,

下面再来说一下Schema约束:

首先来了解一下Schema的相关内容:

XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性,XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd。一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根结点的名称为Schema。编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束。


在来看一下DTD和Schema的区别:
XML Schema符合XML语法结构。
DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
XML Schema对名称空间支持得非常好。
XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。  

这个内容的说明,这里就不做解释了,因为内容太多了,而且有现成的东东,那就是到w3c官网上去找:

http://www.w3.org/TR/2001/REC-xmlschema-0-20010502/#SimpleTypeFacets

这里说的很清楚了,而且有demo,对demo解释的很详细的,就是有一点,他是英文写的,所以英语不好的同学就蛋疼了,自己想办法吧,

我们需要校验我们编写的dtd文件以及xsd文件,xml文件是否正确,我们需要使用MyEclipse工具进行检测,因为IE浏览器是不校验dtd和schema约束的。

最后说的是Schema是很强大的,已经在替代DTD约束模式了,被w3c定义为标准了,同时可以看到Android中的xml文件全部按照Schema模式来编写的。

转载请注明:尼古拉斯.赵四 » XML文件定义约束

喜欢 (2)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址