产生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) |