XML详解
一、XML概述
0x1 XML的基本概念
- XML(Extensible Markup Language,可扩展标记语言)
- 允许开发者自由定义标签,可以将标签和内容有效分离
- XML不再侧重于数据如何展示,而是更多地关注数据如何存储和传输
0x2 XML的应用场景
- XML把数据从HTML分离出来
- 简化数据共享
- 简化数据的传输
- 简化平台的变更
0x3 XML的优势
- 简单易用的标记语言
- 严格的格式
- 数据逻辑和显示逻辑分离
二、XML文档规则
0x1 XML整体结构
- 有且只有一个根元素
- 元素必须合理结束
- 元素之间必须合理嵌套
- 元素的属性必须有值
0x2 XML声明
<?xml version=“1.0” encoding=“GB2312” standalone=“yes”?>
0x3 字符集
- 简体中文:GBK或GB2312
- 繁体中文:BIG5
- 西欧字符:ISO8859-1
- 通用的国际编码:Unicode
- 针对Unicode的可变长度字符编码:UTF8
0x4 XML文档规则
合法标签名
XML文档对于标签名有如下要求:
- 标签名可以字母(包括非西欧字符)、数字、下画线(__)、中画线(—)、冒号 (:)和点号(.)组成,但不能以数字、中画线和点号开头
- 标签名不能包括<、>、,、$等符号
- 标签名中尽量不要出现英文冒号“:”,除非是在使用名字空间
- 标签名不能以字符“xml”( 或者 XML、Xml等任意大小写组合开始)
- 标签名不能包含空格
嵌套子元素
- XML允许无限深度嵌套子元素,只要保证元素之间合理嵌套即可
- XML元素可以嵌套多个重名的子元素,这多个元素之间是有序的
空元素
- XML允许使用空元素语法,空元素不可接受子元素,也不可接受字符串内容
- 空元素和内容为空的元素并不相同
- 空元素只是不能包含子元素,也不能包含字符串内容,但完全可以接受属性,
而且可以接受任意多个属性
字符数据
开始标签和结束标签之间的文本可以是任何Unicode字符,并且其间的任何字符都将忠实地传递给XML处理程序。
如果文本字符串中包含一些特殊的字符,例如尖括号(<)或and符号(&),由于这些符号在XML文档中都有特殊的含义,因此直接在XML元素中使用该字符串将引起文档混乱
1、使用实体引用
为了正确处理XML文档中的特殊字符,XML允许使用实体来表示这些特殊字符。
XML预置了5个实体引用,如表:
实体引用 | 所工表符号 | 说明 |
---|---|---|
< | < | 小于符号 |
> | > | 大于符号 |
& | & | and符号 |
' | ‘ | 英文单引号 |
" | “ | 英文双引号 |
2、使用CDATA标记
在特殊标记CDATA下,所有的特殊字符,甚至是有效的元素都将被当成简单字符处理实体引用也会失去作用,变成纯文本。语法:
<![CDATA[文本内容]]>
注释
XML文档还可加入解释用的字符数据,这些解释用的字符串不会被XML解 析器处理.这些解释用的文本称为注释。语法:
<!--注释字符串-->
注意:
- 不要把注释放在标签之内,否则,该文档将不是一个格式良好的XML文档
- 不要把注释放在XML声明之前,XML声明应该永远处于XML文档的第一行
- 不要在注释中使用双中画线(–)
W3C对于属性的使用建议
属性通常提供属于数据组成部分的信息,如果属性值里包含的信息属于该 实体本身,则应该使用子元素来指定该信息,因此,W3C推荐尽量使用子元素, 而避免使用属性
XML文档分类
1、格式不良好的XML文档
- 完全没有遵守XML文档基本规则的XML文档
2、格式良好但无效的XML文档
-
遵守了XML文档基本规则,但没有使用DTD或Schema定义语义约束的 XML文档
-
使用DTD或Schema定义了语义约束,但没有遵守DTD或Schema所定义 的语义约束的XML文档
3、有效的XML文档
- 遵守了XML文档基本规则,并使用DTD或Schema定义了语义约束,而且 也完全遵守了DTD或Schema所定义的语义约束的XML文档
XML命名空间
在同一份XML文档中可能出现素和属性具有不同的含义和作用,但如果我们不从语法上提供区别,则XML处理器无法区分它们
语法:
xmlns[:prefix]=“命名空间字符串”
命名空间的特征:
- 名字很长 (命名空间往往是一个绝对的URL地址)
- 名字里往往包含英文冒号、斜线等特殊字符
属性使用命名空间
- 通常情况下,由于属性是属于某个元素的,因此很自然地认为属性总是属 于它所在元素所处的命名空间,一般无须专门为属性指定命名空间
三、XPath语言
0x1 XPath概念
XPath语言是一门专门用于在XML文档中查找信息的语言,其他XML程序 可利用XPath在XML文档中对元素和属性进行导航
0x2 XPath节点
节点类型 | 说明 |
---|---|
XML文档根节点 | XML文档的根称为文档节点或根节点 |
元素节点 | 一个元素的开始标签、结束标签,以及开始标签和结束标签之间的全部 内容整体称为元素节点 |
属性节点 | 元素的每个属性都是属性节点。属性节点包括属性名和属性值两个部分。 XPath认为属性节点必须依附于元素节点 |
XML节点 | XML文档里<!–和-->包含的部分就是注释,注释对应的就是注释节点 |
命名空间节点 | 命名空间节点代表XML文档中的xmlns:prefix属性 |
文本节点 | 即XML元素中间的字符数据,包括CDATA段中的字符数据 |
0x3 XPath基本概念
基本值(或称原子值)
- 基本值专门用于表示简单的数据值,例如整数值、字符串等。我们可以基本值当成没有 父节点且没有子节点的节点
项
- 项是XPath2.0提出的一个术语,一个项代表一个节点或基本值
节点集和序列
-
在某些情况下,XPath表达式可以表示多个节点,多个节点组合在一起在XPath1.0里称 为节点集
-
XPath2.0提出一个序列的概念,XPath2.0的序列可以代表一个普通的项,也可以代表节点集
相对路径和绝对路径
XPath同样支持相对路径和绝对路径。对于XPath而言,绝对路径以斜线(/)开头,而相 对路径则不会以斜线(/)开的
例如:
/list/book/name:该路径总是匹配list元素内的book元素之内的name子元素
list/book/name:该路径到底匹配哪个或哪些节点是不确定的
0x4 XPath基础语法
XPath使用路径表达式来定位XML文档中的节点或节点集,每个Xpath表达式总由多个 步(step)组成,多个步之间用斜线分隔
例如:
/list/book/name
XPath中步的完整语法格式如下:
轴::节点测试[限定谓语]
轴
XPath的步使用轴来定义所选节点与当前节点之间的结构关系
节点测试
节点测试用于从指定轴所匹配的节点集中选出特定的节点
限定谓语
限定谓语是一个boolean表达式,或者可以转换为boolean值的表达式, 用于进一步提炼所选的节点集。限定谓语应该放在括号中
语法:
child::book[1]或child::book[position()=1]
简化写法
省略child轴,例如:website/muke等同于child::website/child::muke
使用@符号代替attribute轴,例如:book[@isbn=“123456”]等同于 child::book[attribute::isbn=“123456”]
使用//代表后代表节点,例如://book等同于/descendant-orself::node()/child::book
使用一个点代表当前节点 ,例如:./book等同于self::node()/child::book
使用两个点代表上一级节点,例如:…/book等同于parent::node()/child::book