更新时间:2024-04-28 GMT+08:00

产生XML内容

本节函数和类函数的表达式可以用来从SQL数据产生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注释。该文本中不能包含“--”或以一个“-”结尾,这样的文本才是有效的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
 6
 7
 8
 9
10
11
12
13
14
15
16
17
SELECT xmlelement(name foo);
 xmlelement
------------
 <foo/>
(1 row)

SELECT xmlelement(name foo, xmlattributes('xyz' as bar));
    xmlelement
------------------
 <foo bar="xyz"/>
(1 row)

SELECT xmlelement(name foo, xmlattributes(current_date as bar), 'cont', 'ent');
             xmlelement
-------------------------------------
 <foo bar="2023-08-16">content</foo>
(1 row)

没有合法XML名称的元素和属性名会被转义,转义的方式是将不合法的字符用序列_xHHHH_替换,其中HHHH是该字符以16进制表达的Unicode代码点。例如:

1
2
3
4
5
SELECT xmlelement(name "foo$bar", xmlattributes('xyz' as "a&b"));

            xmlelement
----------------------------------
 <foo_x0024_bar a_x0026_b="xyz"/>

如果属性值是一个列引用,则不需要指定显式的属性名,这种情况下默认将把列名用作该属性的名字。在其他情况下,必须给该属性一个显式的命名。因此这个例子是合法的:

1
2
CREATE TABLE test (a xml, b xml);
SELECT xmlelement(name test, xmlattributes(a, b)) FROM test;

但这些就不合法:

1
2
SELECT xmlelement(name test, xmlattributes('constant'), a, b) FROM test;
SELECT xmlelement(name test, xmlattributes(func(a, b))) FROM test;

元素内容(如果指定)将被根据其数据类型进行格式化。如果内容本身是类型xml,则会构建复杂的XML文档。例如:

1
2
3
4
SELECT xmlelement(name foo, xmlattributes('xyz' as bar),xmlelement(name abc),xmlcomment('test'),xmlelement(name xyz));
                  xmlelement
----------------------------------------------
 <foo bar="xyz"><abc/><!--test--><xyz/></foo>

其他类型的内容将被格式化为合法的XML字符数据。这意味着特别的字符<、>以及&将会被转换成实体。二进制数据(数据类型bytea)将被表示为base64或者十六进制编码,具体取决于配置参数xmlbinary。

xmlforest(content [AS name] [, ...])

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

返回值类型:xml

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
SELECT xmlforest('abc' AS foo, 123 AS bar);
          xmlforest
------------------------------
 <foo>abc</foo><bar>123</bar>
(1 row)

SELECT xmlforest(table_name, column_name) FROM ALL_TAB_COLUMNS WHERE schema = 'pg_catalog';
                                                       xmlforest
------------------------------------------------------------------------------------------------------------------------
 <table_name>pg_authid</table_name><column_name>rolsuper</column_name>
 <table_name>pg_authid</table_name><column_name>rolinherit</column_name>
 <table_name>pg_authid</table_name><column_name>rolcreaterole</column_name>

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
9
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
----------------------
 <bar/><foo>abc</foo>
(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)