XML学习记录一

XML (extensible markup language) 可扩展标记语言,提供了一套跨平台、跨网络、跨程序语言的数据描述方式

简介

主要可分为包括两个部分:文档声明 和 文档内容

文档声明: 形如<?xml version="1.0" encoding="UTF-8"?>
文档内容:通过标记有序地展现出来。开始标记以"<“开始,以”>“结束,结束标记以”</“开始,以”>"结束。且开始和结束标记中的内容大小写敏感。每个标记必须包含开始和结束标记,开始和结束标记之间的内容为标记内容

一个XML文档有且只能有一个根标记,其他所有标记必须嵌套在当前标记内部。

什么是标记语言

标记语言指用一系列约定好的标记对电子文档进行标记,以实现对电子文档的语义、结构及格式的定义。

HTML 与 XML是标记语言体系中最成功的两种标记语言。
HTML和XML的区别

HTMLXML
用途用于数据显示用于描述和保存数据
标记标记固定不变没有固定标记,根据实际需要进行定义,XML本身是一种元语言
语法语法要求宽松有严格的语法要求

分类

格式不良好的XML文档:不完全遵守XML语法要求
格式良好的XML文档:遵守XML语法要求
有效的XML文档:一个使用DTD或者schema语义约束,并且符合其语义约束的,格式良好的XML文档

组成

XML文档由XML声明、文档类型声明、处理指令、注释、元素 5个部分组成

XML声明:

<?xml version="1.0" encoding="UTF-8" ?>

可包含三个属性 version encoding standalone
注:以上"<?" 和"?>"是开始和结束标记,xml表示此文档是xml文档,xml紧跟在开始标记后,不能有空格。

文档类型声明:

DTD文件 schema文件
也可以不引用外部DTD文件,直接在文档中给出DTD(文档类型定义)

DTD用于定义语法规则,本身不要求遵循XML规则。几乎所有的XML应用都是使用DTD定义的,HTML就有一个标准的DTD文件,所以其组织结构和所有的标签都是固定的。

处理指令:

例 <?xml-stylesheet type="text/css" href="mycss.css" ?>
通知XML引擎,应用CSS文件显示XML文档内容
处理指令包括两个部分:目标和传递给应用程序的字符数据
目标标识要用到的应用程序,可以是要使用的程序的名字或者一个类似于xml-stylesheet的名字,其余部分是传递给应用程序的字符数据

注释

注释以"<!--"开始,以"-->"结束

元素

元素通常以开始标记 结束标记和标记内容构成,是XML文件的基本对象,例如

<tag>aaa</tag>   <tag>是开始标记 </tag>是结束标记 aaa是标记内容 全部加起来是元素

元素包括开始标签 结束标签 以及两者间的内容,包括属性 文本 注释 和子元素。

元素有两种形式,空元素和非空元素。
空元素建议使用单标记,非空元素包括子元素或者文本内容,同时带有子元素和文本内容的元素可以使用,但是不建议。

元素内容

字符数据:字符数据不可以包含任何标记的起始定界符和CDATA段的结束定界符,即不能包含&、<、和"]]>"
字符引用和实体引用:在字符数据中,不能有&、<,可以用XML预定义的字符引用或者实体引用来表示。在XML文档中还可以自定义实体内容。
CDATA段:CDATA段以"<![CDATA["开始,以"]]>"结束,表示中间的都是纯文本,不需要被解析
空白处理:xml:space通知程序如何处理元素中的空白。xml:space=“default” 表示允许程序处理空白,xml:space表示通知程序保留空白
行为处理:为了统一。XML处理器会在解析前,将所有的回车换行和换行 转换成单个的回车符。
语音标识: xml:lang 表示元素的内容和属性值使用的语言 如xml:lang=“en”

XML基本语法规则

1 XML中可以包含单标记或者双标记
2 大小写敏感
3 标签需要符合命名规则 可以使用中文,标签中部可以包含空格,字符串不能包括XML的大小写形式(预留给系统)
4 所有标签以巢装方式嵌套
5 所有属性值必须用单引号或者双引号括起来
6 有且只能由一个根元素

在网络的数据交换中,XML文档处理需要遵守语法要求外,还需要遵守语义约束。DTD和schema文件都是对XML语义的约束。与Schema模式文件相比,DTD对命名空间的支持不够好。

命名空间

命名空间的提出是为了解决XML文档中,元素名称相同,但是含义不同的情况,因此命名空间用以界定元素所属的命名空间,明确定义。

命名空间声明方式 xmlns[:prefix]=“命名空间字符串”
prefix表示命名空间别名

1 没有前缀的命名空间表示默认命名空间,在一个文件中有且只有一个
2 有前缀的命名空间可以使用多个
特殊写法:命名空间别名和命名空间URL都不存在,如

<book xmlns="">

表示book元素以及其包含的子元素的默认命名空间不在任何空间内。

元素对命名空间的使用,表示元素位于所属的命名空间中
命名空间别名:标记名

属性对命名空间的使用
属性很少用命名空间,但是如果在属性上没有使用任何命名空间,此时属性不是属于默认命名空间爱你,而是不属于任何命名空间。(属性的命名空间是独立的,即无论属性所属的元素属于任何命名空间,都与属性的命名空间无关)

Schema 文件

XML Schema (XML Schema Definition) XSD

与DTD相比,Schema是描述 约束 和检查XML文档的新方法。是DTD的替代者

优势:
可以针对未来需求扩展
基于XML进行编写
支持数据类型
支持命名空间

XML建议规范中包含两个基础命名空间。一个用于Schema文档的Schema URI 即http://www.w3.org/2001/XMLSchema 通常使用xs代表该命名空间;另一个用于XML 文档,即http://wwww.w3.org/2001/XMLSchema-instance 通常使用xsi代表该命名空间。

Schema文件示例:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="school">
	<xs:complexType>
		<xs:sequence>
			<xs:element name="name" type="xs:string"/>
			<xs:element name="major" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
</xs:element>
</xs:schema>

引用方法

一、 xsi:noNamespaceSchemaLocation
如果被引入的Schema文件需要约束XML文件中不属于任何命名空间的元素,则使用该属性引入
语法:

<根元素名称 xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Schema 文件路径">

二、 xsi:schemaLocation
语法:

<根元素名称 xmlns:命名空间别名="命名空间URI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="命名空间URI Schema文件路径">

Schema的语法结构

基本语法结构如下:

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

<xs:schema xmlns:xs=“http://www.w3.org/2001/XMLSchema”>
…[元素、注释、属性、数据类型、Schema的复用]
</xs:schema>

元素

定义元素的语法格式:

语法1
<element name=“名称” type=“数据类型” [default=“默认值”] [minOccurs] [maxOccurs]/>

语法2

<element name="名称" type="数据类型" [default="默认值"] [minOccurs] [maxOccurs]/>
Element type
</element>

语法3
<element ref=“引用元素名称” type=“数据类型” [default=“默认值”] [minOccurs] [maxOccurs]/>

元素分为简单元素和复杂元素,简单元素不能包含属性和子元素,复杂元素可以包含属性和子元素。
类型1常用于定义简单元素,类型2用于定义复杂元素,类型3是引用通过类型1或者2定义的元素。

元素也可分为全局和局部元素。在schema元素中定义的元素称为全局元素(即schema元素的直接子元素),可以被其他任意元素引用。局部元素是在复杂类型中的元素,仅能在该元素的外部元素中使用。

元素组:
把多个元素和约束组合到一个整体,能够更好的实现复用。
语法如下:

<xs:group name="元素组名称">
包含多个元素和约束
</xs:group>

引用语法;

<xs:group ref="元素组名称">
属性

只有复杂元素才可以包含属性
定义属性的语法格式:

语法1:

<xs:attribute name="属性名" type="属性类型" default="默认值" [fixed= "固定值"]></xs:attribute>

语法2

<xs:attribute ref="属性名"></attribute>

与元素相同,属性按照定义位置可分为全局属性和局部属性。在schema元素下定义的属性为全局属性,可以被任意元素引用。在复杂类型中定义的属性为局部属性,仅能在该属性的元素中使用。

属性组:
为了更好的实现属性的复用

<xs:attributeGroup name="属性组名称"></xs:attributeGroup>

引用语法:

<xs:attributeGroup ref="属性组名称">
注释

可用XML的注释格式或者通过标记annotation进行注释

<annotation>
<documentation></documentation>
<appinfo></appinfo>
</annotation>

annotation通常放在Schema组件定义的开始部分,说明组件作用。documentation主要供人阅读,appinfo主要供其他程序使用。documentation和appinfo的顺序和出现次数无限制。

Schema的数据类型

根据元素内容划分:简单数据类型 复杂数据类型
简单数据类型:不包含属性和子元素的类型
复杂数据类型:包含属性 或者 子元素 或者 属性和子元素的类型

按照扩展方式划分:内置数据类型 用户自定义数据类型
内置数据类型都是简单类型

内置数据类型

内置数据类型可分为 任意类型 内置基本数据类型 和 内置扩展数据类型

任意类型:
anyType: 任意 无限制
anySimpleType: 任意简单类型

内置基本数据类型:
(1) 字符串与相关类型:
string 字符串 保留空白
QName 该元素可以包含XML命名空间
(2)数值类型
decimal 小数
float 单精度 32位浮点数
double 双精度 64位浮点数
hexBinary 表示16进制数
(3)日期类型
date YYYY-MM-DD格式
gYearMonth YYYY-MM格式
gYear YYYY格式
gMonthDay MM-DD格式
gDay DD格式
gMonth MM格式
(4)时间类型
duration
dateTime
time
(5)boolean类型:
boolean 只能接受true false 0 1
(6)anyURI
anyURI 表示一个URI,用来定位文件
(7)二进制数据类型
base64Binary 表示任意base64编码的二进制数
hexBinary 任意十六进制编码的二进制数
(8)NOTATION
NOTATION 不能在模式中出现的抽象类型,只能用于派生其他类型

内置扩展数据类型
内置扩展数据类型是基于string类型或者decimal类型派生出来的

(1)string类型派生出两种数据类型,
1)第一类只能用于约束属性的类型
NMTOKEN
NMTOKENS
ID
IDREF
IDREFS
ENTITY
ENTITIES
2)第二类可用于属性或者元素类型
normalizedString
token
language
Name
NCName

(2)由decimal类型派生出的数据类型在数据范围上更加具体。能够更准确地描述数据
integer
long
int
short
byte

用户自定义数据类型

包括全局类型和局部类型,区别与全局元素 局部元素相同

自定义简单数据类型
在内置数据类型的基础上通过限制、联合、列表中的一种或者几种方式形成的新数据类型。

<xs:simpleType [name="自定义类型名称"]>
[限制、联合、列表的一种或者几种方式]
</xs:simpleType> 

限制:
<xs:restriction base=“基类型”></xs:restriction>

联合:
<xs:union memberTypes=“多个简单类型”>, 多个简单类型以空格隔开
或者union中包含多个simpleType子元素

<xs:union>
[<simpleType>]+
</xs:union>

列表:
<xs:list itemType=“列表元素类型”></xs:list>
或者

<xs:list>
[<simpleType>]
</xs:list>

自定义复杂数据类型
复杂数据类型所约束的内容可能包含属性、子元素、属性和子元素

定义复杂元素的格式如下

<xs:complexType>
[顺序 选择 无序 简单内容 复杂内容]+
</xs:complexType>

顺序:表明子元素是有序的
选择:从所有的子元素中选择一个
无序:子元素无序(限制:子元素数量只能是0或者1,不能有属性)
简单内容:如果目标元素只包含属性而不包含元素,则可以用simpleContent定义元素内容,类似于编程语言继承
复杂内容:如果目标元素包含子元素,则用complexCotent定义元素内容。在某一基类型上进行限制或扩展,类似于编程语言的继承

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值