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

XML函数

产生XML内容

  • XMLPARSE ( { DOCUMENT | CONTENT } value)

描述:从字符数据中生成一个XML类型的值。

返回值类型:xml

示例:

1
2
3
4
5
SELECT xmlparse(document '<foo>bar</foo>');
xmlparse
----------------
<foo>bar</foo>
(1 row)
  • XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type

描述:从XML类型的值生成一个字符串。

返回值类型:type,可以是character,character varying或text(或其别名)

示例:

1
2
3
4
5
SELECT xmlserialize(content 'good' AS CHAR(10));
xmlserialize
--------------
good
(1 row)
  • xmlcomment(text)

描述:用于创建一个使用指定文本作为内容的XML注释。该文本不能包括“--”或者以一个“-”结尾。当参数为空时,结果也为空。

返回值类型:xml

示例:

1
2
3
4
5
SELECT xmlcomment('hello');
xmlcomment
--------------
<!--hello-->
(1 row)
  • xmlconcat(xml[, ...])

描述:用于将XML值组成的列表串接成一个单独的值。空值会被忽略,当参数都为空值时,结果都为空。

返回值类型:xml

示例:

1
2
3
4
5
SELECT xmlconcat('<abc/>', '<bar>foo</bar>');
xmlconcat
----------------------
<abc/><bar>foo</bar>
(1 row)

说明:XML声明如果存在,结果如下:如果都使用相同的XML版本声明,则在结果中使用版本,否则不用版本。如果都有standalone属性,且值都为yes, 则结果中standalone值为yes,如果至少有一个是no,则结果中standalone值为no。否则结果中将不带standalone属性。

示例:

1
2
3
4
5
SELECT xmlconcat('<?xml version="1.1"?><foo/>', '<?xml version="1.1" standalone="no"?><bar/>');
xmlconcat
-----------------------------------
<?xml version="1.1"?><foo/><bar/>
(1 row)
  • xmlelement(name name [, xmlattributes(value [AS attname] [, ... ])] [, content, ...])

描述:使用给定名称、属性和内容产生一个XML元素。

返回值类型:xml

示例:

1
2
3
4
5
SELECT xmlelement(name foo, xmlattributes(current_date as bar), 'cont', 'ent');
xmlelement
-------------------------------------
<foo bar="2020-08-15">content</foo>
(1 row)
  • xmlforest(content [AS name] [, ...])

描述:使用给定名称和内容产生一个元素的XML森林(序列)。

返回值类型:xml

示例:

1
2
3
4
5
SELECT xmlforest('abc' AS foo, 123 AS bar);
xmlforest
------------------------------
<foo>abc</foo><bar>123</bar>
(1 row)
  • xmlpi(name target [, content])

描述:创建一个XML处理指令。内容不能包含字符序列?>

返回值类型:xml

示例:

1
2
3
4
5
SELECT xmlpi(name php, 'echo "hello world";');
xmlpi
-----------------------------
<?php echo "hello world";?>
(1 row)
  • xmlroot(xml, version text | no value [, standalone yes|no|no value])

描述:修改一个XML值的根节点的属性。如果指定了一个版本,它会替换根节点的版本声明中的值;如果指定了一个standalone值,它会替换根节点standalone中的值。

返回值类型:xml

示例:

1
2
3
4
5
SELECT xmlroot(xmlparse(document '<?xml version="1.0" standalone="no"?><content>abc</content>'), version '1.1', standalone yes);
xmlroot
--------------------------------------------------------------
<?xml version="1.1" standalone="yes"?><content>abc</content>
(1 row)
  • xmlagg(xml)

描述:函数xmlagg是一个聚集函数,将输入值串接起来。

返回值类型:xml

示例:

1
2
3
4
5
6
7
8
CREATE TABLE test (y int, x xml);
INSERT INTO test VALUES (1, '<foo>abc</foo>');
INSERT INTO test VALUES (2, '<bar/>');
SELECT xmlagg(x) FROM test;
xmlagg
----------------------
<foo>abc</foo><bar/>
(1 row)

为了决定串接的顺序,可以为聚集调用增加一个ORDER BY子句,例如:

1
2
3
4
5
SELECT xmlagg(x ORDER BY y DESC) FROM test;
xmlagg
----------------------
<bar/><foo>abc</foo>
(1 row)

XML谓词

  • xml IS DOCUMENT

描述:如果参数XML值是一个正确的XML文档,则IS DOCUMENT返回真;如果非正确XML文档,则返回假;参数为空时返回空。

返回值类型:bool

  • xml IS NOT DOCUMENT

描述:如果参数XML值不是一个正确的XML文档,则IS NOT DOCUMENT返回真;如果是正确XML文档,则返回假;参数为空时返回空。

返回值类型:bool

  • XMLEXISTS(text PASSING [BY REF] xml [BY REF])

描述:如果第一个参数中的XPath表达式返回任何节点,则函数XMLEXISTS返回真,否则返回假(如果哪一个参数为空,则结果就为空)。BY REF子句没有作用,用于保持SQL兼容性。

返回值类型:bool

示例:

1
2
3
4
5
SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Toronto</town><town>Ottawa</town></towns>');
xmlexists
-----------
t
(1 row)
  • xml_is_well_formed(text)

描述:检查text字符串是不是格式良好的XML值,返回布尔结果。如果xmloption参数设置为DOCUMENT则检查文档,如果设置为CONTENT则检查内容。

返回值类型:bool

示例:

1
2
3
4
5
SELECT xml_is_well_formed('<abc/>');
xml_is_well_formed
--------------------
t
(1 row)
  • xml_is_well_formed_document(text)

描述:检查text字符串是不是格式良好的文档,返回布尔结果。

返回值类型:bool

示例:

1
2
3
4
5
SELECT xml_is_well_formed_document('<test:foo xmlns:test="http://test.com/test">bar</test:foo>');
xml_is_well_formed_document
-----------------------------
t
(1 row)
  • xml_is_well_formed_content(text)

描述:检查text字符串是不是格式良好的内容,返回布尔结果。

返回值类型:bool

示例:

1
2
3
4
5
SELECT xml_is_well_formed_content('content');
xml_is_well_formed_content
----------------------------
t
(1 row)

处理XML

  • 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)
  • 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"><COUNTRY_ID>xx</COUNTRY_ID><COUNTRY_NAME>xx</COUNTRY_NAME></ROW><ROW id="2"><COUNTRY_ID>xx</COUNTRY_ID><COUNTRY_NAME>xx</COUNTRY_NAME></ROW><ROW id="3"><COUNTRY_ID>xx</COUNTRY_ID><COUNTRY_NAME>xx</COUNTRY_NAME></ROW></ROWS>'
COLUMNS id INT PATH '@id',
_id FOR ORDINALITY,
country_id TEXT PATH 'COUNTRY_ID',country_name TEXT PATH 'COUNTRY_NAME' NOT NULL);
id  |   _id  | country_id | country_name
----+-----+---------------+--------------
  1 |   1 | xx         | xx
  2 |   2 | xx         | xx
  3 |   3 | xx         | xx
(3 rows)

将表映射到XML

  • table_to_xml(tbl regclass, nulls boolean, tableforest boolean, targetns text)

描述:把表的内容映射成XML值。

返回值类型:xml

  • table_to_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)

描述:把关系表的模式映射成XML模式文档。

返回值类型:xml

  • table_to_xml_and_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)

描述:把关系表映射成XML值和模式文档。

返回值类型:xml

  • query_to_xml(query text, nulls boolean, tableforest boolean, targetns text)

描述:把SQL查询的内容映射成XML值。

返回值类型:xml

  • query_to_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)

描述:把SQL查询映射成XML模式文档。

返回值类型:xml

  • query_to_xml_and_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)

描述:把SQL查询映射成XML值和模式文档。

返回值类型:xml

  • cursor_to_xml(cursor refcursor, count int, nulls boolean, tableforest boolean, targetns text)

描述:把游标查询映射成XML值。

返回值类型:xml

  • cursor_to_xmlschema(cursor refcursor, nulls boolean, tableforest boolean, targetns text)

描述:把游标查询映射成XML模式文档。

返回值类型:xml

  • schema_to_xml(schema name, nulls boolean, tableforest boolean, targetns text)

描述:把模式中的表映射成XML值。

返回值类型:xml

  • schema_to_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)

描述:把模式中的表映射成XML模式文档

返回值类型:xml

  • schema_to_xml_and_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)

描述:把模式中的表映射成XML值和模式文档。

返回值类型:xml

  • database_to_xml(nulls boolean, tableforest boolean, targetns text)

描述:把数据库的表映射成XML值。

返回值类型:xml

  • database_to_xmlschema(nulls boolean, tableforest boolean, targetns text)

描述:把数据库的表映射成XML模式文档

返回值类型:xml

  • database_to_xml_and_xmlschema(nulls boolean, tableforest boolean, targetns text)

描述:把数据库的表映射成XML值和模式文档。

返回值类型:xml

将表映射到XML有关函数的参数说明如下:

  • tbl:表名。
  • nulls:在输出中是否包含空值,若为true,列中的空值表示为:<columnname xsi:nil="true"/>,若为false,包含空值的列会从输出中省略。
  • tableforest:若为true,则输出xml片段,false,输出xml文档。
  • targetns:指定想要结果的XML命名空间。若不指定,应传递一个空字符串。
  • query:SQL查询语句。
  • cursor:游标名。
  • count:从游标中获取的数据量。
  • schema:模式名