# XML类型
XML数据类型可以用于存储格式良好的、遵循XML标准定义的"文档"以及"内容"片段，该类型通过引用更广泛的"DOCUMENT NODE"XQUERY和XPATH数据模型来定义，允许内容片段包含多个顶层元素或字符节点，通过表达式XMLVALUE IS DOCUMENT可判断特定XML值是完整文档还是文档片段。其内部格式和TEXT类型相同，但与直接在TEXT域中存储XML数据相比，XML数据类型的优势在于它支持基于LIBXML2提供的标准XML操作函数和XML规范性检查。XML类型相关函数请参见[XML类型函数](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0097.html)。
XML解析器将XML文档转换为XML DOM对象。DOM（Document Object Model 文档对象模型）定义了访问和操作文档的标准方法。XML DOM（XML Document Object Model）定义了访问和操作XML文档的标准方法。XML DOM将XML文档视为树结构。所有元素都可以通过DOM树来访问，可以修改或删除它们的内容，并创建新的元素，一个元素、元素的文本、以及元素的属性都被视为节点。
XML底层使用和TEXT类型一样的数据结构进行存储，最大为1GB。
示例：
```
gaussdb=# CREATE TABLE xmltest ( id int, data xml ); 
gaussdb=# INSERT INTO xmltest VALUES (1, 'one');
gaussdb=# INSERT INTO xmltest VALUES (2, XMLCONCAT(('<?xml version="1.0" encoding="UTF8" standalone="no"?><bar>foo</bar>'), ('<?xml version="1.0" encoding="UTF8" standalone="no"?><bar>foo</bar>')));
gaussdb=# SELECT * FROM xmltest ORDER BY 1;
 id |                               data                                
----+-------------------------------------------------------------------
  1 | one
  2 | <?xml version="1.0" standalone="no"?><bar>foo</bar><bar>foo</bar>
(2 rows)
gaussdb=# DROP TABLE xmltest;
```
XML类型不支持以下操作：
- 逻辑表达式and、or、not。
- 作为非XML操作函数的系统函数的入参。
- 作为分布键、分区键、二级分区键、主键或唯一约束。
- XML相关的隐式类型转换，包括字符串和XML类型之间的隐式转换。
- 数组表达式、行表达式、子查询表达式、TABLE OF和TABLE OF INDEX。
- 使用XML字段创建普通索引、unique索引、global索引、local索引或部分索引。
- 比较表达式\>、\<、\>=、\<=、=、\<\>、!=、\^=、between and、is distinct from、is not distinct from、\<=\>。
- 条件表达式decode、nullif、greatest、least。
- 作为distinct、group by、order by表达式的参数。
- 聚合函数sum、max、min、avg、list_agg、corr、covar_pop、covar_samp、stddev、stddev_pop、stddev_samp、var_pop、var_samp、variance、bit_and、bit_or、bool_and、bool_or、every、regr_avgx、regr_avgy、regr_count、regr_intercept、regr_r2、regr_slope、regr_sxx、regr_sxy、regr_syy、rank、spread。
- 不支持ODBC相关绑定传参接口。
 
XML类型支持如下操作：
- 物理备份恢复。
- 空值判断is null、is not null。
- 条件表达式case、coalesce。
- 全局临时表和本地临时表。
- 强制类型转换。
- 表达式索引。
- XML类型的输入值需要符合XML格式标准。
- 支持gs_dump导出和gs_restore导入操作。
- 并行查询，支持Astore和Ustore存储引擎。
- 作为自定义函数的入参、出参、自定义变量和返回值。
- 作为存储过程的入参、出参、自定义变量和返回值。支持自治事务的存储过程。
- 字符处理函数quote_literal(string text)（需显式转换为字符类型）、quote_nullable(string text)（需显式转换为字符类型）。
- 聚集函数count、array_agg、checksum（需显式转换为字符类型）、string_agg（需显式转换为字符类型）。
- 自定义类型中复合类型涉及XML类型的增删改查，且与普通表中的XML字段一样，需要按照XML的语法插入和修改。
- 支持JDBC和ODBC对XML数据类型进行操作，支持对该字段执行SELECT、UPDATE、INSERT或DELETE操作，使用SQL语法输入XML值，使用ResultSet类的getSQLXML方法获取XML值。支持JDBC相关绑定传参接口，可使用PreparedStatement预处理语句接口中的setSQLXML方法和ResultSet执行结果集接口中的getSQLXML(int columnIndex)方法。 调用流程：需要使用java.sql.SQLXML接口类构造XML对象，再设置对象类型为Oid.XML，然后将类型ID和XML值发送到服务端，从服务端获取返回结果后，先调用ResultSet.getString，再通过java.sql.SQLXML接口类将获取的字符串构造成XML对象，此时会再次检查其内容是否符合XML标准格式。所以XML值也可以通过ResultSet.getString直接获取字符串对象。
  
 
