XML | DTD | Schema


XML

可扩展标记语言 Extensible Markup Language ,类似HTML,但和HTML完全不一样。目前遵循xml1.0规范。它是通用的数据交换格式。

允许用户自定义标签。一个标签用于描述一段数据。

XML作用

  • 用于客户端Client和服务器Server之间传递数据
    • 服务器就是装着服务端程序的高配置电脑,配置较高,CPU一般用intel的志强处理器。
  • 保存有关系的数据
  • 用作软件配置文件
  • 对安卓层次来讲,界面布局文件还有manifest清单文件
  • 提高系统的灵活性

XML语法

文档声明

文档声明出现的位置必须在xml文件第一行

<?xml version="1.0"?>

保存的时候xml声明的编码要跟文件保存的编码保持一直,如果不声明编码。默认使用的是utf-8

比如:

<?xml version="1.0"?>
<中国>
	<河南>
		<郑州></郑州>
		<洛阳></洛阳>
	</河南>
</中国>

中文编码规则:gbk(大概2w汉字)gb2312(大概5k汉字)utf-8

手动声明编码规则:

<?xml version="1.0" encoding="gbk"?>

还有个standalone说明文档是否独立,是否依赖其他文档,如:

<?xml version="1.0" encoding="gbk" standalone="yes"?>

元素

元素指文件中出现的标签,一个标签分为起始和结束标签(不能省略),标签是必须闭合的

一个标签允许嵌套标签,但是要注意层次顺序,先开始后闭合,后开始先闭合。

一个XML文档必须有且仅有一个根标签,其他标签都是其后代标签

<tag></tag>

注意:XML文档并不会忽略\r\n \t等等

命名规范:

  • 区分大小写
  • 不能以数字或下划线开头
  • 不能用xml保留字
  • 不能包含空格
  • 名称中间不能包含冒号:

属性

  • 属性要写在开始标签
  • 属性名称的命名规范与元素命名规范相同
  • 属性一定要用引号(单或双都行)引起来
  • 属性可以用子标签的形式来表示

下面这段代码用了两种方式:

<?xml version="1.0"?>
<Persons>
	<person name='wzq'>
    	<firstName>zq</firstName>
        <lastName>w</lastName>
    </person>
</Persons>

注释

语法格式为:

<!-- 我是注释 -->

注意:

  • 注释不能放在第一行,第一行必须是文档声明
  • 注释不能嵌套
  • eclipse快捷键ctrl+shift+/

CDATA区

CDATA里面的内容不会被解析器解析

<![CDATA[]]>

他的作用就是:比如我们的XML文档里面要写一些xml不允许的语法比如大于号>小于号<等特殊字符,这时候就用CDATA进行声明。

比如:

<?xml version="1.0"?>
<persons>
	<person>
    	<![CDATA[<firstName> <w><w><w> </firstName>]]>
        <lastName>wzq</lastName>
    </person>
</persons>

特殊字符

对于一些特殊字符,若要在主题元素中显示,必须转义

特殊字符 转义替代符号
& &amp;
< &lt;
> &gt;
" &quot;
&apos;

XML约束

为什么要使用约束?

XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确的获取文件中的内容而报错。

  • 格式良好的XML:遵顼XML语法的XML

  • 有效的XML:遵循约束文档的XML

格式良好的不一定有效,有效的一定格式良好

XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称为约束文档

总之:约束文档定义了XML中允许出现的元素名称,属性及元素出现的顺序

常用的约束技术:

  • XML DTD
  • XML Schema

DTD(Document Type Definition)

文档类型定义。编码必须使用UTF-8

作用:约束XML书写规范

注意:DTD可以写在单独的文件中,扩展名是dtd,编码必须是utf-8

引入外部DTD文档

第一种方式:当引用的DTD文档在本地时,可以这样写:

<!DOCTYPE 根元素 SYSTEM "book.dtd">

比如:

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

第二种方式:当引用的DTD文档在公共网络上,这样写:

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档URL">

比如:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,lnc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

在文档内部编写

DTD约束文档可以在XML文档种直接定义,(编码没有要求)

DTD语法——定义元素

在DTD文档种使用ELEMENT关键字来声明一个XML元素

语法:

<!ELEMENT 元素名称 使用规则>

使用规则:

  • (#PCDATA):指示元素内容只能时普通的文本
  • EMPTY:用于指示元素的主体为空
  • ANY:用于指示元素的主题内容为任意类型
  • (子元素):指示元素种包含的子元素

定义子元素及描述他们的关系:

  • 如果子元素用逗号分开,数媒必须按照声明顺序去写XML文档
  • 如果子元素用|,说明任选其一
  • + * ?来表示元素出现的此输
    • 如果子元素后面没有+ * ?说明必须出现一次
    • +表示至少出现一次
    • *表示可有可无
    • ?表示0或1次

DTD语法——定义属性

ATTLIST关键字来为一个元素声明属性,语法:

<!ATTLIST 元素名称 属性名1 属性值类型 设置说明……>

属性值类型:

  • CDATA:表示属性的取值为普通的文本字符串
  • (a|b|c):说明只能从中任选其一
  • ID:表示属性的取值不能重复

设置说明:

  • #REQUIRED:表示该属性必须出现
  • #IMPLIED:表示该属性可有可无
  • #FIXED:表示属性的取值为一个固定值,语法#FIXED "固定值"

DTD语法——定义引用实体

在DTD中定义,在XML中使用

语法:

<!ENTITY 实体名称 "实体内容">

引用:

&实体名称

DTD约束实例

<?xml version="1.0"?>
<!DOCTYPE 书架(书+)[
	<!ELEMENT 书架 (书+)>
	<!ELEMENT  (书名,作者,售价)>
	<!ELEMENT 书名 (#PCDATA)>
	<!ELEMENT 作者 (#PCDATA)>
	<!ELEMENT 售价 (#PCDATA)>
	<!ATTLIST 
		ISBN ID #REQUIRED
		COMMENT CDATA #IMPLIED
		STYLE (a|b) #IMPLIED
		出版社 CDATA "demo"
	>
	<!ENTITY JY "金庸">
]>
<书架>
	< ISBN='a' COMMENT='ddd' STYLE='a'>
        <书名>射雕英雄传</书名>
        <作者>&JY</作者>
        <售价>0$</售价>
    </>
    < ISBN='b' STYLE='b'>
    	<书名>神雕侠侣</书名>
        <作者>金庸</作者>
        <售价>0$</售价>
    </>
</书架>

Schema约束

他的出现克服了DTD的局限性,Schema文件自身就是一个XML文件,但它的扩展名通常为.xsd

XML Schema VS DTD:

  • Schema符合XML语法结构
  • DOM、SAX等XML API很容易解析出XML Schema文档中的内容
  • Schemanamespace支持的很好
  • Schema比DTD支持更多的数据类型,并支持用户自定义新的数据类型
  • Schema定义约束的能力非常抢答,可以对XML实例文档做出细致的语义限制
  • Schema不能像DTD一样定义实体,比DTD更复杂,但Schema正在逐步替代DTD,在安卓中,清单文件和布局文件用到了Schema技术

Schema约束文档示例

这是Schema约束文档

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.lesileqin.com/book" 
	xmlns:tns="http://www.lesileqin.com/book" 
	elementFormDefault="qualified">
	<xs:element name="书架">
		<xs:complexType>
			<xs:sequence maxOccurs='unbounded'>
				<xs:element name="">
					<xs:complexType>
						<xs: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>

这是对应的xml文件,下面这个xml文件应该完全符合上述schema的标准

<?xml version="1.0" encoding="UTF-8"?>
<tns:书架 xmlns:tns="http://www.lesileqin.com/book" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.lesileqin.com/book book.xsd ">
  <tns:>
    <tns:书名>tns:书名</tns:书名>
    <tns:作者>tns:作者</tns:作者>
    <tns:售价>tns:售价</tns:售价>
  </tns:>
</tns:书架>

Schema教程

请参考这个链接:点我

发布了211 篇原创文章 · 获赞 414 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/lesileqin/article/details/105081698