今天在做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文件定义约束的更多相关文章

  1. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系

    XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...

  2. 菜单之二:使用xml文件定义菜单

    参考<疯狂android讲义>2.10节 P174,参见归档project:XmlMenuDemo.zip 一般推荐使用XML文件定义菜单. 基本步骤如下: 1.定义布局文件 为简单显示原 ...

  3. XML(二)之DTD——XML文件约束

    前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束.废话不多说,我们直接来正题! 一.DTD简介 1.1.DTD概述 DTD(Document Type Definition,文 ...

  4. 菜单之二:使用xml文件定义菜单 分类: H1_ANDROID 2013-11-03 09:39 1038人阅读 评论(0) 收藏

    参考<疯狂android讲义>2.10节 P174,参见归档project:XmlMenuDemo.zip 一般推荐使用XML文件定义菜单. 基本步骤如下: 1.定义布局文件 为简单显示原 ...

  5. Android笔记(六十六) android中的动画——XML文件定义属性动画

    除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...

  6. 【javaweb学习】XML和约束模式

    xml:可扩展标记语言,w3c组织发布的,用于保存有关系的数据,作为配置文件,描述程序模块之间的关系 <?xml version="1.0" encoding="g ...

  7. XML的约束(schema)

    XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,其出现是为了克服DTD的局限性 XML Schema符合XML语法结构 DOM.SAX等XML API很容易解析出XML Sc ...

  8. XML的约束(dtd)

    DTD(Document Type Definition),文档类型定义,DTD文件应使用UTF-8或Unicode   1.XML中有多少个元素,就在dtd文件中写几个 <!ELEMENT&g ...

  9. 使用XML文件定义菜单

    Android提供了两种创建菜单的方式,一种是在Java代码中创建,一种使用XML资源文件定义.上面的实例都是在Java代码中创建菜单,在Java代码中创建菜单存在如下不足. 在Java代码中定义菜单 ...

随机推荐

  1. Centos7搭建SkyWalking分布式追踪,以mysql为存储

    Skywalking专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统,即应用性能监控系统,为微服务架构和云原生架构系统设计.它通过探针自动收集所需的指标,并进行分布式追踪.通过 ...

  2. C++子类的构造函数后面加:冒号的作用(转)

    在C++类的构造函数中经常会看到如下格式的写法: MyWindow::MyWindow(QWidget* parent , Qt::WindowFlags flag) : QMainWindow(pa ...

  3. CleanMyMac x如何关闭自动更新,CleanMyMac关闭自动更新的方法

    在众多Mac清理软件中,CleanMyMac x应该是大多数Mac用户的选择,因为它不仅可以帮助我们清理系统垃圾,还可以帮助我们彻底卸载Mac上不需要的应用程序.今天要给大家介绍的是CleanMyMa ...

  4. Vue学习笔记【5】——如何定义一个基本的Vue代码结构

    插值表达式{{}} 和 v-text 默认 v-text 是没有闪烁问题的: v-text会覆盖元素中原本的内容,但是 插值表达式只会替换自己的这个占位符,不会把 整个元素的内容清空 v-cloak ...

  5. Android中ViewPgae中的Fragment如何确认当前页面可见的问题

    由于在ViewPage中PageAdapter来管理所有的Fragment.在加载一个Fragment的时候,会自动缓存左右几个(默认是一个)页面,此时也会调用到正常的生命周期函数,onCreate, ...

  6. BulkLoad加载本地文件到HBase表

    BulkLoad加载文件到HBase表 1.功能 将本地数据导入到HBase中 2.原理 BulkLoad会将tsv/csv格式的文件编程hfile文件,然后再进行数据的导入,这样可以避免大量数据导入 ...

  7. BZOJ 3771: Triple(FFT+容斥)

    题面 Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: "这把斧头,是不是你的?" 樵夫一看:&qu ...

  8. 找关键字,分割字符串,输出一个vector

    vector<string> split(const string& str, const string& delim) { vector<string> re ...

  9. 剑指offer——丑数(c++)

    题目描述只包含质因子2.3和5的数称作丑数(UglyNumber).例如6.8都是丑数,但14不是,因为它包含质因子7,习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路:1.逐个 ...

  10. java基础集合底层介绍

    ArrayList.Vector.HashMap.HashTable.HashSet的默认初始容量.加载因子.扩容增量 这里要讨论这些常用的默认初始容量和扩容的原因是: 当底层实现涉及到扩容时,容器或 ...