XML与XPath
XMl语言
简介
XML又叫做可扩展标记语言。它和HTML语言一样是标记语言,且结构基本一致,然后他们之间也有很多不同的地方:
- XML主要用于数据的传输和储存;HTML主要用于数据的显示
- XMl是没有被预定义标签,需要自行定义标签;HTML是被预定义了的标签
- XML都是双标签;HTML有单标签
- XMl对大小写敏感;HTML对大小写不敏感
- XML会保留所有的空格;HTML只会留下一个空格
基本结构
XML是一种树结构,它从根部开始不断的向外延伸:
其具体的文档形式如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<name>Mingle</name>
<age>18</age>
<hometown>MeiShan</hometown>
</note>
其中,<?xml version="1.0" encoding="ISO-8859-1"?>
是对XML的声明,定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)。下一行的<note>
标签就是根元素的开始,每一个标签的名字是可以任意取得,只要在其他地方有意义就行了。
实体引用和注释
在HTML中,一些字符拥有特殊的意义,为了避免出现错误,我们需要借助实体引用来实现,以下是XML中的5个预定义的实体引用:
预定义 | 含义 |
---|---|
< |
< |
> |
> |
& |
& |
' |
' |
" |
" |
XML中的注释和HTML语法一样,即<!--comment--> |
元素内容
元素内容在XMl里面很常见,如<name lang="English">Minlge</name>
,其中name
就是元素内容,Mingle
是文本内容。
XML元素命令有以下规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
另外,我们要尽量避免在命名的过程中使用"-"、"."和":"这些字符。
属性
XML的属性就是在元素内容中的附加内容,如上面例子中的lang="English"
就叫做属性。属性必须被引号包围,单引号和双引号都可以使用,不过当属性内容里面有双引号的时候,我们可以用单引号包围属性或者在里面使用实体引用,如下:
<gangster name='George "Shotgun" Ziegler'>
<gangster name="George "Shotgun" Ziegler">
因为XML属性有以下缺点:
- 属性无法包含多重的值(元素可以)
- 属性无法描述树结构(元素可以)
- 属性不易扩展(为未来的变化)
- 属性难以阅读和维护
所以,我们并不建议盲目地使用元素,不过如果我们要给元素内容添加标识的话,可以使用。
XPath
选取节点
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
谓语
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素 |
/bookstore/book[position()❤️] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00 |
选取未知节点
XPath 通配符可用来选取未知的 XML 元素
通配符 | 描述 |
---|---|
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
路径表达式 | 结果 |
---|---|
//book/titleΙ//book/price | 选取 book 元素的所有 title 和 price 元素 |
//titleΙ//price | 选取文档中的所有 title和price元素 |
/bookstore/book/titleΙ//price | 选取属于bookstore元素的book元素的所有title元素,以及文档中所有的price元素 |
XPath轴
轴可定义相对于当前节点的节点集。
轴名称 | 结果 |
---|---|
ancestor | 选取当前节点的所有先辈(父、祖父等) |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
attribute | 选取当前节点的所有属性 |
child | 选取当前节点的所有子元素 |
descendant | 选取当前节点的所有后代元素(子、孙等) |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身 |
following | 选取文档中当前节点的结束标签之后的所有节点 |
namespace | 选取当前节点的所有命名空间节点 |
parent | 选取当前节点的父节点 |
preceding | 选取文档中当前节点的开始标签之前的所有节点 |
preceding-sibling | 选取当前节点之前的所有同级节点 |
self | 选取当前节点 |
位置路径表达式
位置路径可以是绝对的,也可以是相对的。绝对路径起始于正斜杠(/),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:
绝对位置路径:
/step/step/...
相对位置路径:
step/step/...
步的语法:
轴名称::节点测试[谓语]
实例
例子 | 结果 |
---|---|
child::book | 选取所有属于当前节点的子元素的 book 节点 |
attribute::lang | 选取当前节点的 lang 属性 |
child:😗 | 选取当前节点的所有子元素 |
attribute:😗 | 选取当前节点的所有属性 |
child::text() | 选取当前节点的所有文本子节点 |
child::node() | 选取当前节点的所有子节点 |
descendant::book | 选取当前节点的所有 book 后代 |
ancestor::book | 选择当前节点的所有 book 先辈 |
ancestor-or-self::book | 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点) |
child:😗/child::price | 选取当前节点的所有 price 孙节点 |
XPath运算符
运算符 | 描述 |
---|---|
Ι | 计算两个节点集 |
+ | 加法 |
- | 减法 |
* | 乘法 |
div | 除法 |
= | 等于 |
!= | 不等于 |
< | 小于 |
<= | 小于或等于 |
> | 大于 |
>= | 大于或等于 |
or | 或 |
and | 与 |
mod | 计算除法的余数 |