# 产生XML内容
本节函数和类函数的表达式可以用来从SQL数据产生XML内容。适用于将查询结果格式化成XML文档以便于在客户端应用中处理。
#### XMLPARSE ( { DOCUMENT \| CONTENT } *value*)
描述：从字符数据中生成一个XML类型的值。
返回值类型：xml
示例：
```
SELECT xmlparse(document '<foo>bar</foo>');
    xmlparse
----------------
 <foo>bar</foo>
(1 row)
```
#### XMLSERIALIZE ( { DOCUMENT \| CONTENT } *value* AS *type*
描述：从XML类型的值生成一个字符串。
返回值类型：type，可以是character，character varying或text（或其别名）
示例：
```
SELECT xmlserialize(content 'good' AS CHAR(10));
 xmlserialize
--------------
 good
(1 row)
```
#### xmlcomment(text)
描述：用于创建一个XML值，它含有一个以指定文本作为内容的XML注释。该文本中不能包含"--"或以一个"-"结尾，这样的文本才是有效的XML注释。当参数为空时，结果也为空。
返回值类型：xml
示例：
```
SELECT xmlcomment('hello');
  xmlcomment
--------------
 <!--hello-->
(1 row)
```
#### xmlconcat(xml\[, ...\])
描述：用于将XML值组成的列表串接成一个单独的值。其中空值会被忽略，当所有参数都为空时，结果都为空。
返回值类型：xml
示例：
```
SELECT xmlconcat('<abc/>', '<bar>foo</bar>');
      xmlconcat
----------------------
 <abc/><bar>foo</bar>
(1 row)
```
说明：XML声明如果存在，结果如下：如果所有参数值都使用相同的XML版本声明，则在结果中使用版本，否则不用版本。如果所有参数值都有standalone属性，且值都为yes， 则结果中standalone值为yes，如果至少有一个是no，则结果中standalone值为no。否则结果中将不带standalone属性。
示例：
```
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
示例：
```
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代码点。例如：
```
SELECT xmlelement(name "foo$bar", xmlattributes('xyz' as "a&b"));
            xmlelement
----------------------------------
 <foo_x0024_bar a_x0026_b="xyz"/>
```
如果属性值是一个列引用，则不需要指定显式的属性名，这种情况下默认将把列名用作该属性的名字。在其他情况下，必须给该属性一个显式的命名。因此这个例子是合法的：
```
CREATE TABLE test (a xml, b xml);
SELECT xmlelement(name test, xmlattributes(a, b)) FROM test;
```
但这些就不合法：
```
SELECT xmlelement(name test, xmlattributes('constant'), a, b) FROM test;
SELECT xmlelement(name test, xmlattributes(func(a, b))) FROM test;
```
元素内容（如果指定）将被根据其数据类型进行格式化。如果内容本身是类型xml，则会构建复杂的XML文档。例如：
```
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
示例：
```
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
示例：
```
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
示例：
```
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
示例：
```
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子句即可决定串接的顺序，例如：
```
SELECT xmlagg(x ORDER BY y DESC) FROM test;
        xmlagg
----------------------
 <bar/><foo>abc</foo>
(1 row)
```
