`
king_tt
  • 浏览: 2112381 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

XML文件定义约束

 
阅读更多

今天在做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上机第二次作业Schema

    1、学习如何使用XMLSPY集成开发环境完成XML Schema相关的开发工作。2、掌握XML Schema与DTD之间的区别,能够...3、掌握如何准确定义数据之间的参照完整性约束,如何在模式中使用多态性支持,如何在文档中定义空值等等。

    struts1配置文件定义文件

    struts1配置文件定义文件,约束了struts-config.xml文件中都包含哪些元素

    XML - 实验(2) -- Schema

    3、掌握如何准确定义数据之间的参照完整性约束,如何在模式中使用多态性支持,如何在文档中定义空值等等。 [提交内容] 提交book.xsd、book.xml(使用多态)。 提交SpyBase1. xsd、SpyBase2. xsd。

    xmlbean的jar

    正常情况下,每个XML文件都有一个Schema文件,XML Schema文件是一个XML的约束文件,它定义了XML文件的结构和元素.以及对元素和结构的约束. 通俗地讲,如果说XML文件是数据库里的记录,那么Schema就是表结构定义.

    xml入门教程/xml入门教程

    2.xml文件是由元素和元素的内容以及属性组成的,一个xml文件中只能有一个根元素,标签和标签的内容加在一起叫作一个元素。xml是大小写 敏感的,只能以字母或下划线开头。 字符转义 &lt; 代表 ", &gt; 代表 "&gt;" , &...

    从初识XML到解析XML

    文章目录XML的简介XML文件的创建XML语法XML元素dtd约束Schema约束使用dom4j解析使用xpath解析 XML的简介 XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是...

    根据XSD检查XML并修复

    附件是我写的一个demo程序,该程序的功能是根据一个定义好的XSD文件去检查指定的XML文件是否满足XSD的约束。 这里的约束比标准的约束要弱一些,比如:这里的约束不限制元素出现的顺序,只关心有没有这个元素。 我...

    vscode-xml-complete:XML编辑助手(使用XSD schemaLocation)

    此扩展通过提供提示来帮助编辑XML文件。 示例提供了XAML文件类型( WPF , Avalonia )和csproj文件。 它不需要像java , python或xmllint类的任何运行时,而需要进行部分XSD解析。 特征 基本的linter(XML +部分...

    day023-xml解析笔记和代码.rar

    第一行用了定义xml文件的,写版本号和字符集 1.注释不能放到第一行 1.必需有声明,声明必需在第一行。 2.文档声明的字符编码必需和文档本身的编码一致 2.标签不能交叉嵌套使用(标签名字随便...

    Schema 语法.xmind

    很多JAVA框架,都会用XML文件作为配置文件,而XML文件往往对元素都有严格的定义,这个时候就需要对xml进行约束,用的最多的就是XML Schema。本文件是对XML Schema语法学习整理的思维导图,包括如果定义和使用schema...

    论文研究 - 具有结构偏好的XML查询的树模式匹配算法

    在提出的算法中,最佳解决方案是通过在文档(树)的上下文中使用Skyline运算符(在关系数据库中定义)的适应方法来逐步过滤到满足最大优先约束的部分解决方案集中而获得的。 对文件施加的唯一限制是“非自包含”。

    PowerShell入门教程之创建和使用配置文件实例

     PowerShell的配置文件,不像Windows操作系统中那样使用.ini文件,也不像多数应用程序那样使用XML文件。PowerShell的配置文件都是些普通的PowerShell脚本文件。需要注意的是,这些配置文件的文件名是固定、不能更改...

    netcoreORM:.NetCore轻量级ORM框架

    netcoreORM模型定义文件基于XML文件格式,模型管理基于目录自动分类;数据库类型支持Sqlite, MySql,Oracle,Sqlserver,Postgresql等,数据库配置文件和模型定义相同的基于目录划分,并支持基于目录层级的继承能力...

    类似于GFS的文件系统中可变块大小的性能提升

    本文提出的定义捕获了XML文档在结构上的树状结构特征,并考虑了基于XML文档中具有某些约束条件的子树的XML功能依赖关系的更一般情况,从而克服了XML功能相关定义的缺点依赖性。 还讨论了XML功能依赖项和XML密钥之间...

    environaut:定义,配置和保护您的环境

    目的Environaut应该启用并帮助开发人员定义应用程序的环境,并检查是否满足所有定义的约束。 这包括对应用程序环境的声明和要求,以及使应用程序运行可能必需的一些配置。 有关更多信息,请参见docs/文件夹或 。 当...

    java读写excel源码-pyexcel:用于在csv、ods、xls、xlsx和xlsm文件中读取、操作和写入数据的单一API

    已知约束 不支持字体、颜色和图表。 也不要读取受密码保护的 xls、xlsx 和 ods 文件。 介绍 功能亮点 支持的文件格式列表 文件格式 定义 文件 逗号分隔值 tsv 制表符分隔值 csvz 一个包含一个或多个 csv 文件的 zip ...

    python cookbook(第3版)

    6.4 增量式解析大型XML文件 6.5 将字典转换为XML 6.6 解析和修改XML 6.7 利用命名空间解析XML文档 6.8 与关系型数据库的交互 6.9 编码和解码十六进制数 6.10 编码解码Base64数据 6.11 读写二进制数组数据 ...

    Java核心技术II(第8版)

    2.3.1 文档类型定义 2.3.2 XML Schema 2.3.3 实用示例 2.4 使用XPath来定位信息 2.5 使用名字空间 2.6 流机制解析器 2.6.1 使用SAX解析器 2.6.2 使用StAX解析器 2.7 生成XML文档 2.7.1 使用StAX写出XML文档 2.8 XSL...

Global site tag (gtag.js) - Google Analytics