XML数据查询与转换:XPath和XQuery详解
立即解锁
发布时间: 2025-08-23 01:16:54 阅读量: 2 订阅数: 19 

### XML数据查询与转换:XPath和XQuery详解
#### 1. 引言
随着使用XML进行数据交换、中介和存储的应用程序不断增加,有效管理XML数据的工具变得越来越重要。特别是用于查询和转换XML数据的工具,对于从大量XML数据中提取信息以及在不同的XML表示(模式)之间转换数据至关重要。本文将介绍XPath和XQuery这两种语言,它们在XML数据的查询和转换中发挥着关键作用。
#### 2. XML的树模型
所有相关语言都使用XML数据的树模型。XML文档被建模为一棵树,其中节点对应于元素和属性。元素节点可以有子节点,这些子节点可以是元素的子元素或属性。除根元素外,每个节点(无论是属性还是元素)都有一个父节点,该父节点是一个元素。XML文档中元素和属性的顺序由树中节点的子节点顺序建模。在XML数据的树模型中,使用了父节点、子节点、祖先节点、后代节点和兄弟节点等术语。
元素的文本内容可以建模为元素的文本节点子节点。包含被插入子元素分隔的文本的元素可以有多个文本节点子节点。例如,一个包含 “this is a <bold> wonderful </bold> book” 的元素将有一个对应于 “bold” 元素的子元素子节点,以及两个对应于 “this is a” 和 “book” 的文本节点子节点。由于这种结构在数据表示中不常用,我们假设元素不同时包含文本和子元素。
#### 3. XPath语言
XPath通过路径表达式来定位XML文档的部分内容。它可以看作是面向对象和对象关系数据库中简单路径表达式的扩展,当前的XPath标准版本是XPath 2.0。
##### 3.1 路径表达式基础
XPath中的路径表达式是由 “/” 分隔的一系列位置步骤(而不是SQL中用于分隔位置步骤的 “.” 运算符)。路径表达式的结果是一组节点。例如,在某个文档中,XPath表达式 “/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” 返回这些课程的课程标识符。我们可以通过列出子元素而不进行任何比较操作来测试子元素的存在。
- **函数支持**:XPath提供了几个可用于谓词的函数,包括测试当前节点在兄弟节点顺序中的位置的函数和聚合函数 “count()”,它计算应用该函数的表达式所匹配的节点数量。例如,“/university-2/instructor[count(./teaches/course)> 2]” 返回教授超过两门课程的教师。布尔连接词 “and” 和 “or” 可用于谓词,而 “not(...)” 函数可用于否定。
- **id函数**:“id(“foo”)” 函数返回具有类型为ID且值为 “foo” 的属性的节点(如果有的话)。该函数甚至可以应用于引用集,或包含由空格分隔的多个引用的字符串(如IDREFS)。例如,“/university-3/course/id(@dept name)” 返回课程元素的 “dept name” 属性所引用的所有部门元素。
- **| 运算符**:“|” 运算符允许对表达式结果进行并集操作。例如,“/university-3/course[@dept name=“Comp. Sci”] | /university-3/course[@dept name=“Biology”]” 可以找到计算机科学和生物学课程的并集。但 “|” 运算符不能嵌套在其他运算符中,并且并集中的节点按其在文档中出现的顺序返回。
- **// 符号**:XPath表达式可以使用 “//” 跳过多个节点级别。例如,“/university-3//name” 可以找到 “/university-3” 元素下的所有 “name” 元素,而无需完全了解模式。
- **其他方向选择**:路径中的步骤不必仅从当前节点集的子节点中选择,还可以沿着其他方向进行,如父节点、兄弟节点、祖先节点和后代节点。“//” 是指定 “所有后代” 的简写形式,“..” 指定父节点。
- **内置函数**:内置函数 “doc(name)” 返回指定名称文档的根,名称可以是文件名或URL。返回的根可以在路径表达式中用于访问文档的内容。例如,“doc(“university.xml”)/university/department” 可以返回 “university.xml” 文件中大学的所有部门。“collection(name)” 函数与 “doc” 类似,但返回由名称标识的文档集合。
#### 4. XQuery语言
万维网联盟(W3C)开发了XQuery作为XML的标准查询语言,本文基于2007年1月23日发布的XQuery 1.0版本进行讨论。
##### 4.1 FLWOR表达式
XQuery查询仿照SQL查询,但与SQL有很大不同。它们分为五个部分:for、let、where、order by和return,被称为 “FLWOR”(发音为 “flower”)表达式。
一个简单的FLWOR表达式示例:
```xquery
for $x in /university-3/course
let $courseId := $x/@course id
where $x/credits > 3
return <course id> { $courseId } </course id>
```
- **for子句**:类似于SQL的from子句,指定变量在XPath表达式的结果上取值。当指定多个变量时,结果包括这些变量可能取值的笛卡尔积。
- **let子句**:允许将XPath表达式的结果分配给变量名,以简化表示。
- **where子句**:类似于SQL的where
0
0
复制全文
相关推荐










