XML数据查询与转换的XPath和XQuery语言详解
立即解锁
发布时间: 2025-08-23 00:34:12 阅读量: 5 订阅数: 19 


数据库系统概念第六版精华
### XML数据查询与转换的XPath和XQuery语言详解
#### 1. XML数据管理的重要性与相关语言概述
随着使用XML进行数据交换、中介和存储的应用程序不断增加,有效管理XML数据的工具变得越来越重要。其中,用于查询和转换XML数据的工具对于从大量XML数据中提取信息,以及在不同的XML表示(模式)之间转换数据至关重要。
主要涉及的语言有:
- **XPath**:一种用于路径表达式的语言,是XQuery的构建块。
- **XQuery**:由万维网联盟(W3C)开发的XML标准查询语言,它模仿SQL,但由于要处理嵌套的XML数据,与SQL有显著不同,并且包含XPath表达式。
- **XSLT**:主要用于文档格式化应用,而非数据管理应用,本文不做讨论。
#### 2. XML的树模型
所有相关语言都使用XML数据的树模型。在这个模型中,XML文档被建模为一棵树,节点对应于元素和属性。元素节点可以有子节点,这些子节点可以是子元素或元素的属性。除根元素外,每个节点(无论是属性还是元素)都有一个父节点,该父节点是一个元素。XML文档中元素和属性的顺序由树节点的子节点顺序建模。树模型中使用了父节点、子节点、祖先节点、后代节点和兄弟节点等术语。
元素的文本内容可以建模为元素的文本节点子节点。包含被中间子元素分隔的文本的元素可以有多个文本节点子节点。但在数据表示中,通常假设元素不同时包含文本和子元素。
#### 3. XPath语言详解
XPath通过路径表达式来定位XML文档的部分内容,当前标准版本是XPath 2.0。
##### 3.1 路径表达式基础
XPath中的路径表达式是由“/”分隔的一系列位置步骤(而不是SQL中用于分隔位置步骤的“.”运算符),路径表达式的结果是一组节点。例如,对于某个文档,表达式`/university-3/instructor/name`返回如下元素:
```xml
<name>Srinivasan</name>
<name>Brandt</name>
```
表达式`/university-3/instructor/name/text()`返回相同的名称,但不包含标签。
路径表达式从左到右求值,初始的“/”表示文档的根(一个抽象根,在文档标签`<university-3>`之上)。路径表达式求值过程中,任意点的路径结果是文档中有序的节点集。初始时,“当前”元素集只包含一个节点,即抽象根。当路径表达式的下一步是元素名称(如`instructor`)时,该步骤的结果是当前元素集中元素的指定名称的子元素对应的节点,这些节点成为路径表达式下一步求值的当前元素集。
例如,`/university-3`返回对应`<university-3>`标签的单个节点,`/university-3/instructor`返回对应`<university-3>`节点子元素`<instructor>`的两个节点。路径表达式的最终结果是路径表达式求值最后一步后的节点集,每个步骤返回的节点按其在文档中出现的顺序排列。
由于多个子元素可以有相同的名称,节点集的节点数量可能随每个步骤增加或减少。可以使用“@”符号访问属性值,例如`/university-3/course/@course id`返回课程元素的所有`course id`属性值的集合。默认情况下,IDREF链接不被跟随。
##### 3.2 XPath的其他特性
- **选择谓词**:可以跟在路径的任何步骤之后,包含在方括号中。例如,`/university-3/course[credits >= 4]`返回学分值大于或等于4的课程元素,`/university-3/course[credits >= 4]/@course id`返回这些课程的课程标识符。可以通过不进行任何比较操作来测试子元素的存在,如去掉`>= 4`后,表达式返回所有有`credits`子元素的课程的课程标识符,而不考虑其值。
- **函数**:
- 提供了一些可用于谓词的函数,如测试当前节点在兄弟节点顺序中的位置,以及聚合函数`count()`。例如,`/university-2/instructor[count(./teaches/course)> 2]`返回教授超过两门课程的教师。
- 布尔连接词`and`和`or`可用于谓词,`not(...)`函数可用于取反。
- `id("foo")`函数返回具有类型为ID且值为“foo”的属性的节点(如果有),该函数甚至可以应用于引用集或包含多个由空格分隔的引用的字符串(如IDREFS)。例如,`/university-3/course/id(@dept name)`返回课程元素的`dept name`属性引用的所有部门元素,`/university-3/course/id(@instructors)`返回课程元素的`instructors`属性引用的教师元素。
- **联合运算符`|`**:允许对表达式结果进行联合。例如,`/university-3/course[@dept name="Comp. Sci"] | /university-3/course[@dept name="Biology"]`可找到计算机科学和生物学课程的联合。但`|`运算符不能嵌套在其他运算符中,联合中的节点按其在文档中出现的顺序返回。
- **多级跳过`//`**:XPath表达式可以使用“//”跳过多个节点级别。例如,`/university-3//name`可找到`/university-3`元素下的所有`name`元素,而无需知道它们所在的具体元素和嵌套级别。
- **路径方向**:路径步骤不仅可以从当前节点集的子节点中选择,还可以沿着父节点、兄弟节点、祖先节点和后代节点等多个方向进行。“//”是指定“所有后代”的简写形式,“..”指定父节点。
- **内置函数**:
- `doc(name)`函数返回指定名称文档的根(名称可以是文件名或URL),返回的根可以在路径表达式中用于访问文档内容。例如,若大学数据存储在文件“university.xml”中,表达式`doc("university.xml")/university/department`将返回该大学的所有部门。
- `collection(name)`函数与`doc`类似,但返回由名称标识的文档集合,可用于打开XML数据库,后续的XPath表达式元素将从集合中选择适当的文档。
在大多数示例中,假设表达式在数据库上下文中求值,数据库隐式提供了一组“文档”,此时无需使用`doc`和`collection`函数。
#### 4. XQuery语言详解
XQuery是XML的标准查询语言,基于XQuery 1.0版本进行讨论。
##### 4.1 FLWOR表达式
XQuery查询模仿SQL查询,但与SQL有显著差异。它由五个部分组成:`for`、`let`、`where`、`order by`和`return`,被称为“FLWOR”(发音为“flower”)表达式。
例如,一个简单的FLWOR表达式用于返回学分大于3的课程的课程标识符:
```xquery
for $x in /university-3/course
let $courseId := $x/@course id
where $x/credits > 3
return <course id> { $courseId } </course id>
```
0
0
复制全文
相关推荐









