处理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) |