XML被设计为一种很灵活的标记文档. 但是,有点灵活过头了,因为,可以使用任何自定义标签. 这样的话,很显然很难把控XML到底会被写成个什么样子. 所以,需要给这货一个约束.

DTD约束

DTD,文档类型定义,它可以被定义在XML文件内部,也可以作为一个外部引用来使用.

DTD的书写位置

1.包含在XML文件内部
DTD定义可以使用<! DOCTYPE 根元素 [元素声明]>来包含在XML文档内部.
比如像这样

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

2.外部引用
DTD还可以被定义为一个外部文件,然后在XML内部引用. 此时需要注意:

  • dtd外部文件的格式为xxx.dtd

  • 在XML文件中,使用<!DOCTYPE 根元素 SYSTEM "文件名">来引入dtd文件

比如:一个dtd文件的声明(note.dtd)

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

然后在xml文件内部引用它:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

XML构建模块

一个XML文件到底有哪些部分组成呢? 抽象之后,可以归纳为以下几个简单的结构:

  • 元素:也就是传说中的标签(貌似不是很严谨,精神领会) 比如<body>hello world</body>

  • 属性:可以提供有关元素的额外信息. 属性被放置在开始标签中. 以’键=值’的形式存在. 比如<img src="computer.gif" />
  • 实体:说学术点叫做用来定义普通文本的变量,说的土一点,就是转义字符… 比如&lt
  • PCDATA:好高端的叫法,叫做可以被解析的字符数据(parsed character data),就是XMl元素的开始标签和结束标签之间的文本. xml本质上就是一个文本,xml引擎在读取的时候,文本中的标签会被作为标记来处理,而实体会被展开.
  • CDATA:字符数据(character data),也就是一个不会被解析引擎解析的区域. 其中的所有字符都会被看作字符.

DTD定义元素

DTD中对元素的定义:

<!ELEMENT 元素名称 类别>
或者是
<!ELEMENT 元素名称 (元素内容)>

元素类型定义

  • 声明一个空元素:<!ELEMENT 元素名称 EMPTY>

  • 声明一个字符串元素:<!ELEMENT 元素名称 (#PCDATA)>
  • 声明可以带任意内容的元素:<!ELEMENT 元素名称 ANY>

子元素定义

  • 子元素之间的关系:

    • 按顺序出现(序列): 逗号分隔,<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

    • 或:<!ELEMENT note (to,from,header,(message|body))>
  • 子元素的数量:

    • 只出现一次:<!ELEMENT 元素名称 (子元素名称)>

    • 至少出现一次:<!ELEMENT 元素名称 (子元素名称+)>
    • 出现0次或者多次:<!ELEMENT 元素名称 (子元素名称*)>
    • 出现0次或1次:<!ELEMENT 元素名称 (子元素名称?)>

我在想如果我需要声明几个子元素,但是不考虑顺序的话要怎么写呢?貌似没有给这么个关键字啊… 可以把数量和子元素之间的关系组合一下嘛,比如:
<!ELEMENT note (#PCDATA|to|from|header|message)*>

这样就可以了嘛,可以出现多次的PCDATA、”to”、”from”、”header” 或者 “message”。

DTD属性的定义

通过ATTLIST关键字来声明,像这个样子

<!ATTLIST 元素名称 
属性名称 属性类型 属性约束
属性名称 属性类型 属性约束
>

属性类型

  • CDATA:字符数据

  • (en1|en2|…):枚举类型
  • ID:值为唯一的id
  • IDREF:值为另外一个元素的id

属性约束

  • 值:表示属性的陌生值

  • #REQUIRED:表述属性值是必须的
  • #IMPLIED:属性是可选的
  • #FIXED value:属性值是固定的

DTD实体的定义

实体可以看作一个转义字符(或者说是一个普通文本或者特殊字符的快捷方式的变量)
定义很简单<!ENTITY 实体名称 "实体的值">
使用的时候,在PCDATA区域使用&实体名称;就可以了.

比如:
<!ENTITY author "thecatcher">
使用的时候:
<author> &author;</author>

schema约束

为什么使用schema约束
schema约束可以克服DTD约束的局限性,以下是DTD和schema约束的对比:

  • XML Schema符合xml的语法

  • DOM SAX方式可以很容易的解析XML schema文档
  • XML schema对名称空间支持良好
  • schema支持更多的数据类型定义,并且支持自定义数据类型
  • schema约束能力更强,可以对XML实例文档提供更细致的限制
  • schema不能像DTD定义实体,比DTD更复杂,但是xml schema现在已经是w3c组织的标准.

schema文档的特点:

  • schema约束文档本事就是xml文档,但是它的后缀是.xsd

  • 和XML文件一样,有且仅有一个名为schema根节点

命名空间

使用命名空间的目的是为了避免元素名称冲突.

命名空间的声明格式
xmlns:namespace-prefix="namespaceURI"
在一个文档中,还可以有一个隐式的命名空间,也就是不带前缀的形式:
xmlns="namespaceURI"

在一个元素标签上使用命名空间之后,该元素标签的所有子元素都属于这个命名空间.

在schema中使用命名空间

  • 在全局范围使用命名空间:

    • <schema xmlns="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://www.thecatcher.net/note"
      xmlns:tns="http://www.thecatcher.net/note" >
  • 在非全局范围使用:
    • <schema xmlns="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://www.thecatcher.net/note"
      xmlns:tns="http://www.thecatcher.net/note"
      elementFormDefault="qualified">

可以看出来,唯一的区别就是 非全局范围的时候多了一个elementFormDefault="qualified"属性,这个属性默认值是unqualified,表示,只有全局成分才被定为在目标名称空间中. 而qualified表示目标名称空间包含了非全局的元素定义.

targetNamespace
targetNamespace也是一个名称空间的声明,它定义了Schema定义的新元素与属性的名称空间. 在http://www.w3.org/2001/XMLSchema空间中定义了element,attribute,complexType等元素,如果自身并不适用重用的组件,那么只需要声明targetNamespace就可以,不需要指定别名.

我的理解,schema约束文件本身遵循xml规范,也就是说他本身也是可以约束的,所以schema命名空间其实跟xml命名空间是一样的.

schemaLocation
用于引入一个具有名称空间的schema约束文档.

schema约束的书写流程

XMl.02-约束的更多相关文章

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

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

  2. XML文件定义约束

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

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

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

  4. XML的约束(schema)

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

  5. XML的约束(dtd)

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

  6. xml 引入约束文件

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...

  7. XML DTD约束 对xml文件的crud的查询Read Retrieve操作 xml递归遍历

    本地的dtd文档 xml中引入dtd文档 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 书 ...

  8. 【Javaweb学习笔记】XML和约束模式

    一.XML语法 xml 可扩展标记语言,w3c组织发布的,用于保存有关系的数据,作为配置文件,描述程序模块之间的关系 xml 文件开头必须包括下面的标签: <?xml version=" ...

  9. xml的约束

    一.DTD约束xml 1.约束介绍 由于xml的标签由用户自己定义,因此在开发的时候,每个人都可以根据自己的需求来定义xml标签,这样导致项目中的xml难以维护,因此需要使用一定的规范机制来约束xml ...

  10. XML约束——Schema约束

    XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性 XML Schema VS DTD: •XML Schema符合XML语法结构. • ...

随机推荐

  1. excel 导入数据库 / SSIS 中 excel data source --64位excel 版本不支持-- solution

    当本地安装的excel(2013版) 是64-bit时:出现的以下两种错误 解决: 1. excel 导入数据库 , 如果文件是2007则会出现:“The 'Microsoft.ACE.OLEDB.1 ...

  2. C++工程目录架构

    项目目录结构的问题基本上是个仁者见仁,智者见智的问题,只要自己用着顺手,使用什么样的目录组织结构是没有什么大碍的.当然如果项目很大,参与的人员很多,那么合理的组织一下目录结构还是会有很大的益处的.不同 ...

  3. DBMS_OUTPUT in SQL Developer

    I fell sad for all the programmers(including) that has to SQL Developer as sql IDE. However, if you ...

  4. 选盘秘籍:用户如何选择SSD/SATA/SAS?

    先学习下一些专业词汇 IDE (Integrated Drive Electronics) 电子集成驱动器 它的本意是指把"硬盘控制器"与"盘体"集成在一起的硬 ...

  5. oracle之check约束小结

    一下是Ocp考试指导中,对于oracle约束的描述: The constraint types supported by the Oracle database are as follows:UNIQ ...

  6. OKHttp的容易使用

    OKHttp的简单使用 一方面,最近关于OKHttp的讨论甚嚣尘上,另一方面,我最近也更新了android6.0,发现在6.0中HttpClient不能使用了,于是决定抽时间也看一下OKHttp,总结 ...

  7. HBase工程师线上工作经验总结----HBase常见问题及分析

    阅读本文可以带着下面问题:1.HBase遇到问题,可以从几方面解决问题?2.HBase个别请求为什么很慢?你认为是什么原因?3.客户端读写请求为什么大量出错?该从哪方面来分析?4.大量服务端excep ...

  8. 评论alpha版本发布

    讲解顺序: 1.  新蜂:俄罗斯方块 俄罗斯方块已经完成了核心的游戏部分,可以流畅的进行游戏,经验值功能也已经完成,目前进度很好:不足之处主要有:后续的显示内容还没完成,所以界面空出来很多板块,alp ...

  9. 判断一个数num是否是2的幂(乐视题)

    思路“num &(num-1)==0 返回true,否者返回false.代码如下: boolean isPower(int num){ if(num<=0) return false; ...

  10. php源码之遍历目录下的所有的文件

    <?php //遍历目录下的所有的文件 -- 递归调用 // http://www.manongjc.com/article/1495.html function get_all_file1($ ...