关键字:
Kingbase ES、XML、XPath、人大金仓
概述
在目前的KingBaseES研发过程中,我们会遇到数据库中存储XML格式的数据,XML文档的格式类似于HTML格式,XML是一种扩展标记语言,最早于1998年被引入软件工业界,它不仅可以在WEB前端使用还可以应用于后端数据处理以及数据库存储等。
那么什么是XML,如何解析XML格式,那么接下来将主要从XML的查找信息语言XPath来进行介绍。
XPath
XPath的全称为(XML Path Language)即XML路径语言,它是一门在XML文档中查找信息的语言,XPath可以用来在XML文档中对元素和属性进行遍历。XPath是XSLT中标准的主要元素,并且XQuery与XPointer都构建与XPath表达式之上。XPath于1999年11月16日成为了W3C的标准。
XPath路径表达式:使用路径表达式来选取XML文档中的节点或者节点集,这些路径表达式和我们在常规电脑文件中看到的表达式非常相似。XPath的标准内建函数用于字符串值、数值、日期和时间的比较、节点和QName的处理、序列处理、逻辑值等等...
2.1 XPath节点
在XPath中共有七个类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(根节点)(XML文档是被作为节点树来对待的,树的根被称为文档节点或者根节点),下面提供了一个XML实例,通过这个实例,我们引出XPath节点定义具体表达。
<?xml version="1.0" encoding = "ISO-8859-1"?>
<bookstore>
<book>
<title lang="en">Harry Potter</title>
<author>JK. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
在上述实例中:bookstore属于文档节点,author属于元素节点,lang=“en”属于属性节点。基本值(原子值:Atomic value):基本值是无父或无子的节点。在上述实例中如:JK. Rowling ,"en"。项目(Item):项目是基本值或者节点
节点关系:在XML文档中,每个节点之间有着如家庭关系般的属性联系,因此在XML文档中一般利用父子之间的关系来代替,其中它们的定义为:
- 父:每个元素以及属性都有一个父,在上述的实例中,book元素是title、author、year以及price这些子元素的父。
- 子:元素节点可以有零个、一个或者多个,在上述实例中,title、author、year以及price这些子元素都是book元素的子。
- 同胞:拥有相同的父节点,在上述的实例中,title、author、year以及price这些元素之间都是同胞。
- 先辈:某节点的父、父的父等,在上述实例中title元素的先辈是book元素以及bookstore元素。
- 后代:某个节点的子、子的子等,在上面实例中bookstore元素的后代是book,title,author,year以及price元素。
2.2 XPath语法
在介绍了节点的基本信息后,接下来介绍XPath表达式的语法结构,XPath使用路径表达式来选取XML文档中的节点或者节点集,节点使用过沿着路径(path)或者步(steps)来选取的。下面提供了一个XML实例,通过这个实例,我们引出XPath语法结构定义具体表达。
<?xml version="1.0" encoding = "ISO-8859-1"?>
<booksrore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="CN">代码大全</title>
<price>39.95</price>
</book>
</bookstore>
那么有效的路径表达式就如下所示:
表达式 | 描述 |
nodename | 选取此节点的所有节点 |
/ | 从根节点匹配 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
那么下面是一些语法结构的实例展示:
bookstore : 选取boolstore元素的所有子节点
/bookstore : 选取根元素bookstore。
bookstore/book : 选取属于bookstore的子元素的所有book元素
//book : 选择所有book子元素,而不管它们在文档中的位置
bookstore//book : 选择属于bookstore元素的后代中所有的book元素,而不管它们在bookstore之下的什么位置
//@lang : 选取名为lang的所有属性
为了可以更好的寻找到查找值,XPath中加入谓语表达式,谓语是用来查找某个特定的节点或者包含某个指定的值的节点,谓语被嵌入方括号中。下面是一些实例展示
/bookstore/book[1] : 选取属于bookstore子元素的第一个book元素
/bookstore/book[last()] : 选取属于bookstore子元素的最后一个book元素
/bookstore/book[last()-1] : 选取属于bookstore子元素的倒数第二个book元素
/bookstore/book[position()<3]:选择最前面的链各个属于bookestore元素的子元素的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.
在掌握这些后还有一些通配符如(*:匹配任何元素节点),(@*:匹配任何属性节点),(node():匹配任何类型节点)。
2.3 XPath轴
这是XPath中独有的节点集,利用轴可以定于相对于当前节点的节点集,从而简化搜索复杂度,使得我们可以更好更快的获得XML数据类型。
-----------------------------------------------------------------------
轴名称 | 结果
-----------------------------+-----------------------------------------
ancestor | 选取当前节点的所有先辈(父,祖父等)。
ancestor-or-self | 选取当前节点的所有先辈(父,祖父等)以及当前节点本身。
attribute | 选取当前节点的所有属性
child | 选取当前节点的所有子元素
descendant | 选取当前节点的所有后代元素(子,孙等)。
descendant-or-self | 选取当前节点的所有后代元素(子,孙等)以及当前节点本身。
following | 选取文档中当前节点的结束标签之后的所有节点。
namespace | 选取当前节点的所有命名空间节点。
parent | 选取当前节点的父节点。
preceding | 选取文档中当前节点的开始标签之间的所有节点。
preceding-sibling | 选取当前节点之前的所有同级节点
self | 选取当前节点
-----------------------------------------------------------------------
配合轴的使用,我们就可以很好的写出一个XML文档的搜索表达式:
位置路径表达式:位置路径是绝对的,也可是相对的。绝对路径其使用正斜杠(/),而相对路径不会这样,在两种情况中,位置路径均包括一个或多个步,每个步都被斜杠所分隔:
绝对位置路径: /step/step/...
相对位置路径: step/step/....
每个步均根据当前节点集之中的节点进行计算。步包括:轴:定义所选节点与当前节点之间的树关系,节点测试:识别某个轴内部的节点,零个或者更多谓语:更深入地提炼所选的节点集。
步的语法: 轴名称::节点测试[谓语]
总结
XML文档作为数据库中常见的数据类型,KingbaseES对XML文档具备良好的处理体系,可以很好的完成XML文档的各项需求,XPath也是该处理体系中的一环XML是数据库存储结构的重要组成部分,在了解KingBaseES数据库管理系统的过程中,为了更好的对XML数据类型进行扩展,XML基础知识的学习是必不可少的。