人大金仓数据库KingbaseES 带有命名空间的XMLTABLE使用介绍

90 阅读2分钟

金仓数据库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 }[, ...])

各个参数的含义如下:

  1. 可选的XMLNAMESPACES子句是一个逗号分隔的命名空间列表。它指定文档中使用的XML命名空间及其别名。当前不支持默认的名字空间说明。
  2. 必需的row_expression参数是一个XPath 1.0表达式,通过传递document_expression作为其上下文项,得到一组XML节点。这些节点就是xmltable转换为输出行的内容。如果document_expression为空,或者row_expression产生空节点集或节点集以外的任何值,则不会产生行。
  3. document_expression为row_expression项提供了上下文。它必须是一个格式良好的XML文档,不接受片段/森林。
  4. 必需的COLUMNS子句指定输出表中的列的列表。列名和类型是必需的,(PATH)路径和默认值是可选的。路径后面对应每列将要映射的内容,此内容也可以是多个元素或属性拼接的内容。
  5. 被标记为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 行记录)