16.XML语法、CDATA、约束(DTD、Schema)讲解
xml主要用来描述数据,比如配置文件,网络之间传输数据等,并且在android中也经常用xml来布局,,接下来便来学习xml常用的东西
1.XML语法
xml语法分为:
1.1 文档声明
- 必须位于文档第一行,用来声明当前版本、编码格式以及standlane,如果没有编码格式,折则默认为utf-8,比如为<?xml version="1.0" encoding="UTF-8"?>
1.2 元素
- 元素可以包含子元素,文本内容,或者元素属性.
- 元素名称不能以数字、标点或者xml(包括任意大小写)开头,并且不能包含空格和冒号
比如包含demo文本内容的title元素 :<title>demo</title>
不包含文本的元素:<title></title>
1.3 元素属性
- 一个元素可以有多个属性,每个属性都有它自己的名称name和取值value.
- 属性值value必须是引号引起来的,并且属性名name不能重复
比如:<person name="张三">
1.4 注释
- 在xml声明之前不能有注释
- 注释语法为:<!—这是注释-->
- 注释不能有嵌套,比如这样使用嵌套是出错的: <!—这是注释<!--在嵌套个注释-->-->
- 在eclipse里可以通过ctrl+shift+/快捷键来快速打出注释
1.5 CDATA区
- 位于CDATA 区段中的文本会被解析器忽略,不会去解析
- CDATA内容不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。
- 标记 CDATA内容结尾的 "]]>" 不能包含空格或换行。
- CDATA语法为:<![CDATA[ 内容 ]]>
因为在XML元素中, 字符都会被解析器解析出来,像<>&" 这样的字符会被直接报错,示例如下图所示:
所以如果使用元素无法满足数据信息时,则可以通过CDATA来实现,CDATA一般用来存储函数方法,CSS.大量文本等,比如:
- <![CDATA[
- body {
- background: rgb(,,);
- }
- ]]>
1.6 转义字符
由于在XML元素中, 使用<>&" 这样的字符会被直接报错,除了通过CDATA区替代外,我们还可以通过转义字符来实现.
若要在元素中强制使用,需要转义的字符(包括;)有:
- & : "& ",quotation mark的缩写
- < : "< ",less-than的缩写
- > : "> ", greater than的缩写
- " : "" ", quote的缩写
- ' : "' ",apostrophe的缩写
示例如下:
2.XML约束
如果xml格式出现出错,则程序将不能正确获取文件内容,为了保证数据的规范性和安全性,所以可以编写一个约束文档来约束xml的书写规范,约束文档可以规范xml中出现的指定元素名称,属性以及出现的顺序.
常用的约束有两种:
- DTD约束 :语法简洁,共能比较单一,如果是外部引用,则编码格式只能为utf-8编码,后缀名为.dtd
- Schema约束:语法复杂,功能比较强大,后缀名为.xsd,他是新的xml文档约束,替代DTD的
3.DTD约束
DTD 可被声明于 XML 文档中,也可作为一个外部引用。
3.1 声明于 XML 文档
如果内部使用,则可以直接在文档声明下面写.格式为"<!DOCTYPE 根元素名称 [ 约束内容 ]>"
示例如下:
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE persons [
- <!ELEMENT persons (person+)>
- <!ELEMENT person (年龄,性别,其它信息)>
- <!ELEMENT 年龄 (#PCDATA)>
- <!ELEMENT 性别 (#PCDATA)>
- <!ELEMENT 其它信息 (#PCDATA)>
- <!ATTLIST person
- 姓名 ID #REQUIRED
- 国籍 (中国|外国) #IMPLIED
- 特点 CDATA "吃睡学习"
- 动物级别 CDATA #FIXED "高级动物"
- >
- <!ENTITY zhangsanMsgUrl "person/id43645.com">
- ]>
- <persons>
- <person 姓名="zhangsan" 国籍="中国" >
- <年龄>21</年龄>
- <性别>男</性别>
- <其它信息>zhangsanMsgUrl </其它信息>
- </person>
- <person 姓名="lisi" 特点="吃喝玩乐" >
- <年龄>21</年龄>
- <性别>男</性别>
- <其它信息> person/id9945.com </其它信息>
- </person>
- </persons>
上面的示例,出现了!ELEMENT、!ATTLIST、#REQUIRED等等DTD约束的关键字,接下来我们便来看看这些关键字的作用
!ELEMENT-元素定义
ELEMENT关键字用来声明一个XML元素,语法:<!ELEMENT 元素名称 (使用规则)>
使用规则说明:
- 以逗号,分开 : 表示该元素里的子元素必须按照顺序来写,所以上面示例的person内的子元素顺序为:年龄,性别,其它信息,如果没有逗号则表示该元素只能包含指定的子 元素,比如"<!ELEMENT person (年龄)>"表示person元素里只能有"年龄"子元素
- #PCDATA : 表示元素内容只能是文本,所以上面示例的年龄元素内只能是文本,不能包含子元素.
- + : 表示子元素至少出现一次,所以上面persons里的person可以有多个.
- ? : 表示子元素出现0次或1次
- * : 表示子元素可有可无
- EMPTY: 表示元素的主体为空
- ANY: 表示元素的内容为任意类型
- 以|分开 : 表示子元素任选其一
!ATTLIST-属性定义
ATTLIST关键字用来约束某个元素的属性信息语法:
- <!ATTLIST 元素名称
- 属性名 属性值类型 约束
- 属性名 属性值类型 约束
- ......
- >
属性值类型说明
- ID: 表示属性的取值不能重复(不能与其它相同属性的值一致),不能只写数字
- 以|分开 : 表示属性值任选其一,如果约束为#IMPLIED时,则可以忽略不用选
- CDATA:表示属性值为文本字符串。
约束说明
- #REQUIRED: 表示该属性必须出现
- #IMPLIED: 表示该属性可有可无。
- "字符串": 表示属性的取值为默认值。
- #FIXED "字符串": 表示该属性的取值为一个固定字符串值
3.2 DTD作为外部引用
如果在xml中要使用外部文件的DTD约束,则需要在声明下面写入声明的根元素名以及DTD文件名,格式为"<!DOCTYPE 根元素名称 SYSTEM "文件名称.dtd">"
示例,将3.1的内部使用改为外部引用 persons.xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- "<!DOCTYPE persons SYSTEM "persons.dtd">"
- <persons>
- <person 姓名="zhangsan" 国籍="中国" >
- <年龄>21</年龄>
- <性别>男</性别>
- <其它信息>zhangsanMsgUrl </其它信息>
- </person>
- <person 姓名="lisi" 特点="吃喝玩乐" >
- <年龄>21</年龄>
- <性别>男</性别>
- <其它信息> person/id9945.com </其它信息>
- </person>
- </persons>
persons.dtd文件如下:
- <!ELEMENT persons (person+)>
- <!ELEMENT person (年龄,性别,其它信息)>
- <!ELEMENT 年龄 (#PCDATA)>
- <!ELEMENT 性别 (#PCDATA)>
- <!ELEMENT 其它信息 (#PCDATA)>
- <!ATTLIST person
- 姓名 ID #REQUIRED
- 国籍 (中国|外国) #IMPLIED
- 特点 CDATA "吃睡学习"
- 动物级别 CDATA #FIXED "高级动物"
- >
- <!ENTITY zhangsanMsgUrl "person/id43645.com">
4.Schema约束
- XML Schema是基于 XML 的 DTD 替代者
- XML Schema 符合XML语法结构,并且是可扩展的,后缀名为.xsd(xml schema document)
- XML Schema更容易地描述允许的文档内容,以及约束定义, 并支持名称空间.
4.1 示例-创建personSchema.xsd
在eclipse中,点击File->new->other,然后创建XML Schema File文件,名字为personSchema.xsd.内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
- xmlns="http://www.example.org/personSchema"
- targetNamespace="http://www.example.org/personSchema"
- elementFormDefault="qualified"> <!--讲解1-->
- <xs:element name='persons'> <!--约束xml根元素为persons-->
- <xs:complexType> <!--complexType:定义persons为复合元素-->
- <xs:sequence maxOccurs='unbounded '> <!--讲解2-->
- <xs:element name='person'> <!--约束persons下的子元素名字必须为person-->
- <xs:complexType>
- <xs:sequence> <!--sequence:必须按照顺序实现:先有姓名,最后年龄.-->
- <xs:element name='姓名' type='xs:string' />
- <xs:element name='性别' type='xs:string' />
- <xs:element name='年龄' type='xs:string' />
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- </xs:schema>
讲解1:
xmlns:xs=http://www.w3.org/2001/XMLSchema
- 约束XML里使用xs:作前缀的元素、属性、类型等名称的变量是属于http://www.w3.org/2001/XMLSchema命名空间的。
xmlns=http://www.example.org/personSchema
- 表示默认的命名空间是http://www.example.org/personSchema,也就是指定未使用任何前缀的元素、数据的命名空间为它.
targetNamespace="http://www.example.org/personSchema"
- 显示被此 schema 定义的元素来自命名空间: http://www.example.org/personSchema
讲解2:
<xs:sequence maxOccurs='unbounded'>
- sequence表示必须按照顺序实现, maxOccurs='unbounded'表示可以有多个相同的,比如上面就是表示persons里可以有多个person.
4.2 示例-创建对应的XML
然后在eclips中点击 File->new->other,然后创建XML文件,名字为person.xml,然后点击next,然后选择创建基于schema的XML:
再选择我们刚刚写好的personSchema.xsd:
然后设置文件名为person.xml,且内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <p:persons xmlns:p="http://www.example.org/personSchema"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">
- <p:person>
- <p:姓名>p:张三</p:姓名>
- <p:性别>p:男</p:性别>
- <p:年龄>p:22</p:年龄>
- </p:person>
- <p:person>
- <p:姓名>p:李四</p:姓名>
- <p:性别>p:男</p:性别>
- <p:年龄>p:17</p:年龄>
- </p:person>
- </p:persons>
xmlns:p="http://www.example.org/personSchema"
- 表明此schema中使用的前缀为p:的元素和数据类型来自于"http://www.example.org/personSchema"名称空间
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 指定定义的XML实例名称空间规范格式.默认都以这个2001版本为使用
xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">
- 指定我们使用的"http://www.w3.org/2001/XMLSchema"名称空间的约束格式为personSchema.xsd约束文件的内容(也就是说该xml被personSchema.xsd所约束)
4.3 验证
如下图所示,假如我们不按照personSchema.xsd约束来写XML,则直接出现error:
未完待续,下章学习:
16.XML语法、CDATA、约束(DTD、Schema)讲解的更多相关文章
- xml语法、DTD约束xml、Schema约束xml、DOM解析xml
今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...
- 【JAVA与XML、dtd约束、Schema约束】
一.XML. (1)XML:Extensible Markup Language (2)XML是一种标记语言. (3)XML的设计宗旨是传输数据,而不是显示数据. (4)XML标签没有被预定义,即使用 ...
- 【代码笔记】XML深入学习:DTD约束与DTD语法(1)
2015-12-27 文件名 student.xml <?xml version="1.0" encoding="GB2312" standalon ...
- Eclipse引入自定义XML约束文件(DTD,SCHEMA)问题
Eclipse引入自定义XML约束文件(DTD,SCHEMA)问题 1:说明 使用Eclipse 编写xml文件的约束文件的,包括DTD约束文件,Schema约束文件的时候, 我们也需要接受eclip ...
- JavaScripts学习日记——XML DTD Schema
今日关键词: XML DTD Schema 1.XML 1 XML的概述 1.1 什么是XML XML全称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和 ...
- XML约束——DTD约束
参考: 方立勋老师的讲课视频. 什么是XML约束 •在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 为什么需要XML约束 常用的约束技术 •XML DTD • ...
- XML Dtd Schema
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 整体比较: XML Schema符合XML语法结构. DOM.SAX等XML API很容易解析出XML Schem ...
- Xml一(基本语法和约束)、
XML:eXtensible Markup Language 可扩展标记语言 version="1.0" * 可扩展:所有的标签都是自定义的. * 功能:数据存储 * 配置文件 * ...
- 那点你不知道的XHtml(Xml+Html)语法知识(DTD、XSD)
什么是XHtml: 摘录网上的一句话,XHTML就是一个扮演着类似HTML的角色的XML. XHtml可当模板引擎应用: CYQ.Data 框架里有一套XHtmlAction模板引擎, 应用在QBlo ...
随机推荐
- 自实现input上传指定文件到服务器
遇到问题,解决问题,记录问题,成长就是一步一步走出来的. 一.添加 input 标签 我的工作中遇到了,需要上传pdf文件到服务器的需求,而且只能上传pdf文件,accept指定了 pdf 类型. & ...
- Shrio多Realm认证及认证策略
在大型的系统中,安全数据可能会存放在多个数据库中,而且每个数据的加密方式也是不一样的,那么单一的Realm就无法完成. 这时,就需要用到多Realm认证了,多Realm又涉及到认证策略,及在多个Rea ...
- Kafka producer拦截器(interceptor)
Kafka producer拦截器(interceptor) 拦截器原理 Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制 ...
- PTA 打印沙漏
https://pintia.cn/problem-sets/17/problems/260 #include <bits/stdc++.h> using namespace std; i ...
- Linnux命令大全(vim)
vim复制和粘贴的基本命令(注:需先退出编辑模式) yy复制游标所在行整行.或大写一个Y. (常用) 2yy或y2y复制两行. (常用) y^复制至行首,或y0.不含游标所在处字元. ...
- 用wxpy管理微信公众号,并利用微信获取自己的开源数据。
之前了解到itchat 乃至于 wxpy时 是利用tuling聊天机器人的接口.调用接口并保存双方的问答结果可以作为自己的问答词库的一个数据库累计.这些数据可以用于自己训练. 而最近希望获取一些语音资 ...
- 原生应用使用cordova并与h5应用分离
个人原创地址:https://www.jianshu.com/p/1ad536e76640 1.需求与使用场景 打开一个新页面,要求能够加载本地zip格式的h5应用,该应用使用了某些原生能力:能够 ...
- 前端笔记之React(六)ES6的Set和Map&immutable和Ramda和lodash&redux-thunk
一.ES6的Set.Map数据结构 Map.Set都是ES6新的数据结构,都是新的内置构造函数,也就是说typeof的结果,多了两个: Set 是不能重复的数组 Map 是可以任何东西当做键的对象 E ...
- python的enumerate lambda isinstance filter函数
0x01:filter(function,iterable) filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 接收两个参数,第一个为函数,第二个为序列(可迭 ...
- 理解分布式一致性与Raft算法
理解分布式一致性与Raft算法 永远绕不开的CAP定理 出于可用性及负载方面考虑,一个分布式系统中数据必然不会只存在于一台机器,一致性简单地说就是分布式系统中的各个部分保持数据一致 但让数据保持一致往 ...