金仓数据库KingbaseES 带有命名空间的XMLTABLE使用介绍
关键字:
KingbaseES、XML、XMLTABLE、NAMESPACES、人大金仓、KingbaseES
一、功能概述
xmltable表达式的功能为通过XPath表达式将XML文档的内容映射到列中,返回对应的行集视图。在此过程中,可以指定XPath表达式的命名空间,也可以不指定。也就是说,XMLNAMESPACES部分是可选的。具体的语法如下:
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子句是一个逗号分隔的命名空间列表。它指定文档中使用的XML命名空间及其别名。当前不支持默认的名字空间说明。
- 必需的row_expression参数是一个XPath 1.0表达式,通过传递document_expression作为其上下文项,得到一组XML节点。这些节点就是xmltable转换为输出行的内容。如果document_expression为空,或者row_expression产生空节点集或节点集以外的任何值,则不会产生行。
- document_expression为row_expression项提供了上下文。它必须是一个格式良好的XML文档,不接受片段/森林。
- 必需的COLUMNS子句指定输出表中的列的列表。列名和类型是必需的,(PATH)路径和默认值是可选的。路径后面对应每列将要映射的内容,此内容也可以是多个元素或属性拼接的内容。
- 被标记为FOR ORDINALITY的列将按照从row_expression的结果节点顺序,从1开始,填充行号。最多只能有一个列被标记为FOR ORDINALITY。
使用实例
(1)xml数据中指定默认的命名空间和一个命名空间的别名,在XMLNAMESPACES中指定XPath表达式中使用的命名空间。查询方式及查询结果如下:
CREATE TABLE xmldata AS SELECT
xml $$
SELECT xmltable.\*
FROM xmldata,XMLTABLE(XMLNAMESPACES('http://example.com/myns' AS x,
'http://example.com/b' AS "B"),
'/x:example/x:item'
PASSING data
COLUMNS foo int PATH '@foo',
bar int PATH '@B:bar');
输出结果:
foo | bar
\-----+-----
1 | 2
3 | 4
4 | 5
(3 行记录)
(2)如果xml数据指定了默认命名空间,XMLNAMESPACES中必须指定别名,并在XPath表达式的没有指定别名的节点使用,否则无法查到结果。具体的示例如下:
drop table xmldata;
CREATE TABLE xmldata AS SELECT
xml $$
<example xmlns="http://example.com/myns" xmlns:B="http://example.com/b">
<item foo="1" B:bar="2"/>
<item foo="3" B:bar="4"/>
<item foo="4" B:bar="5"/>
</example>
$$ AS data;
SELECT xmltable.\*
FROM xmldata,XMLTABLE(XMLNAMESPACES('http://example.com/b' AS "B"),
'/example/item'
PASSING data
COLUMNS foo int PATH '@foo',
bar int PATH '@B:bar');
输出结果:
foo | bar
\-----+-----
(0 行记录)
(3)如果在xml数据中指定了命名空间别名,并在XMLNAMESPACES中指定了另外的别名,在XPath路径表达式中使用XMLNAMESPACES中的别名访问。
drop table xmldata;
CREATE TABLE xmldata AS SELECT
xml $$
<example xmlns:B="http://example.com/b">
<item foo="1" B:bar="2"/>
<item foo="3" B:bar="4"/>
<item foo="4" B:bar="5"/>
</example>
$$ AS data;
SELECT xmltable.\*
FROM xmldata,XMLTABLE(XMLNAMESPACES('http://example.com/b' AS "c"),
'/example/item'
PASSING data
COLUMNS foo int PATH '@foo',
bar int PATH '@c:bar');
输出结果:
foo | bar
\-----+-----
1 | 2
3 | 4
4 | 5
(3 行记录)