更新时间:2024-03-06 GMT+08:00

处理XML

为了处理数据类型XML的值,GaussDB(DWS)提供了函数xpath和xpath_exists计算XPath表达式以及XMLTABLE表函数。

xpath(xpath, xml [, nsarray])

描述:它返回一个XML值的数组对应xpath表达式所产生的节点集。如果xpath表达式返回一个标量值而不是节点集,将返回一个单个元素的数组。

该函数的第二个参数xml必须是一个完整的XML文档,它必须有一个根节点元素。

第三个参数为可选参数,是一个命名空间的数组映射。这个数组应该是一个二维text数组,第二个维的长度等于2(它应该是一个数组的数组,其中每一个正好包含2个元素)。每个数组项的第一个元素是命名空间名称的别名,第二个元素是命名空间URI。这个数组中提供的别名不必与XML文档本身中使用的别名相同。换句话说,在XML文档和xpath函数上下文中,别名都是本地的。

返回值类型:xml值的数组

示例:

1
2
3
4
5
SELECT xpath('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>', ARRAY[ARRAY['my', 'http://example.com']]);
 xpath
--------
 {test}
(1 row)

要处理默认(匿名)命名空间:

1
2
3
4
5
SELECT xpath('//mydefns:b/text()', '<a xmlns="http://example.com"><b>test</b></a>',ARRAY[ARRAY['mydefns', 'http://example.com']]);
 xpath
--------
 {test}
(1 row)

xpath_exists(xpath, xml [, nsarray])

描述:函数xpath_exists是xpath函数的一种特殊形式。这个函数不是返回满足XPath的XML值,它返回一个布尔值表示查询是否被满足。这个函数等价于标准的XMLEXISTS谓词,不过它还提供了对一个名字空间映射参数的支持。

返回值:bool

示例:

1
2
3
4
5
SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>', ARRAY[ARRAY['my', 'http://example.com']]);
 xpath_exists
--------------
 t
(1 row)

xmltable

描述:xmltable函数根据输入的XML数据、XPath路径表达式、列的定义信息生成一个表。xmltable在语法上类似于一个函数,但它只能以表的形式出现在查询的FROM子句里。

返回值:setof record

语法:

1
2
3
4
5
6
XMLTABLE ( [ XMLNAMESPACES ( namespace_uri AS namespace_name [,  ...] ), ]
                row_expression PASSING [ BY  { REF | VALUE } ]
document_expression [ BY  { REF | VALUE } ]
COLUMNS name  { type  [ PATH column_expression  ] [ DEFAULT default_expression ] [ NOT NULL | NULL ] | FOR ORDINALITY }
[, ...]
)

参数说明:

  • 可选的XMLNAMESPACES子句是一个逗号分隔的命名空间定义列表,其中namespace_uri都是text类型表达式,namespace_name都是简单标识符。XMLNAMESPACES指定了在文档中使用的XML命名空间及它们的别名。当前不支持默认的命名空间声明。
  • 必选的row_expression参数是一个XPath 1.0表达式,该表达式根据提供的XML文档document_expression进行计算获取XML节点序列,该序列是xmltable转换成输出行的顺序。如果document_expression值为NULL,或row_expression产生空的节点集,结果将不返回任何行。
  • document_expression参数用于输入XML文档,输入的文档必须是符合XML格式的文档,不接受XML片段数据或格式错误的XML文档。BY REF和BY VALUE子句不起作用,仅用于实现SQL标准兼容性。
  • COLUMNS子句指定输出表中字段列表定义,列名和列的数据类型是必选的,路径、默认值和是否为空子句是可选的。
    • 列的column_expression是一个XPath 1.0表达式,用于从row_expression计算出当前行中提取出列的值。如果没有给出column_expression,那么字段名将用作隐式路径。
    • 列可以被标记为NOT NULL,如果NOT NULL列的column_expression不返回任何数据,并且没有DEFAULT子句或者default_expression的计算结果为NULL,就会报错。
    • 标记为FOR ORDINALITY的字段将从1开始填充行号,其顺序为从row_expression结果集中检索到的节点顺序,最多只有一列可以标记为FOR ORDINALITY。

      XPath 1.0没有为节点指定顺序,因此返回结果的顺序取决于数据获取顺序。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT * FROM XMLTABLE('/ROWS/ROW'
PASSING '<ROWS><ROW id="1"><CITY_ID>1002a</CITY_ID><CITY_NAME>snowcity</CITY_NAME></ROW><ROW id="2"><CITY_ID>1003b</CITY_ID><CITY_NAME>icecity</CITY_NAME></ROW><ROW id="3"><CITY_ID>1004c</CITY_ID><CITY_NAME>windcity</CITY_NAME></ROW></ROWS>'
COLUMNS id INT PATH '@id',
ordinality FOR ORDINALITY,
CITY_id TEXT PATH 'CITY_ID',CITY_name TEXT PATH 'CITY_NAME' NOT NULL);
 id | ordinality | city_id | city_name
----+------------+---------+-----------
  1 |          1 | 1002a   | snowcity
  2 |          2 | 1003b   | icecity
  3 |          3 | 1004c   | windcity
(3 rows)