XML类型函数
产生 XML 内容
下列函数可以用来从 SQL 数据产生 XML 内容。它们特别适合于将查询结果格式化成 XML 文档以便于在客户端应用中处理。
xmlparse ( { DOCUMENT | CONTENT } value)
描述:使用函数xmlparse, 来从字符数据产生xml类型的值。
参数:数据类型为text
返回值类型:xml
示例:
SELECT XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>'); SELECT XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>');
返回结果依次为:
xmlparse ---------------------------------------------------------- <book><title>Manual</title><chapter>...</chapter></book> (1 row) xmlparse --------------------------------- abc<foo>bar</foo><bar>foo</bar> (1 row)
xmlserialize( { DOCUMENT | CONTENT } value AS type )
描述:使用函数xmlserialize, 来从xml产生一个字符串。
参数:类型可以是character,character varying或text或其中某个的变种。
返回值类型:xml
示例:
SELECT XMLSERIALIZE(CONTENT 'good' AS CHAR(10)); SELECT xmlserialize(DOCUMENT '<head>bad</head>' as text);
返回结果依次为:
xmlserialize -------------- good (1 row) xmlserialize ------------------ <head>bad</head> (1 row)
当一个字符串值在没有通过XMLPARSE或XMLSERIALIZE的情况下,与xml类型进行转换时,分别的选择DOCUMENT与CONTENT由”XML option” 会话配置参数决定,这个配置参数可以由标准命令来设置:
SET XML OPTION { DOCUMENT | CONTENT };
或使用类似的语法来设置:
SET xmloption TO { DOCUMENT | CONTENT };
xmlcomment(text)
描述:创建一个XML值,并且它包含一个用指定文本作为内容的XML注释。该文本不包含“-”字符且不存在是“-”字符的结尾、符合XML注释的格式要求。且当参数为空时、结果也为空。
参数:数据类型为text。
返回值类型:xml
示例:
SELECT xmlcomment('hello');
返回结果为:
xmlcomment -------------- <!--hello--> (1 row)
xmlconcat(xml[, …])
描述:将由单个XML值组成的列表串接成一个单独的值,该值包含一个XML的内容片断。其中空值会被忽略,并且只有当所有参数都为空时结果才为空。
参数:数据类型为xml。
返回值类型:xml
示例:
SELECT xmlconcat('<abc/>', '<bar>foo</bar>');
返回结果为:
xmlconcat ---------------------- <abc/><bar>foo</bar> (1 row)
xmlelement(name name [, xmlattributes(value [AS attname] [, … ])] [, content, …])
描述:使用给定名称、属性和内容产生一个XML元素。
返回值类型:xml
示例:
SELECT xmlelement(name foo);
返回结果为:
xmlelement ------------ <foo/> (1 row)
xmlforest(content [AS name] [, …])
描述:使用给定名称和内容产生一个元素的XML序列。
返回值类型:xml
示例:
SELECT xmlforest('abc' AS foo, 123 AS bar); SELECT xmlforest(table_name, column_name) FROM information_schema.columns WHERE table_schema = 'pg_catalog';
返回结果依次为:
xmlforest ------------------------------ <foo>abc</foo><bar>123</bar> (1 row) xmlforest ------------------------------------------------------------------------------------------- <table_name>pg_authid</table_name><column_name>rolname</column_name> <table_name>pg_authid</table_name><column_name>rolsuper</column_name> ...
xmlpi(name target [, content])
描述:创建一个XML处理指令。 如果content内容不为空,则content内容不能包含字符序列
?>
。处理指令(Processing Instructions,PI)是用
<? ?>
包围的一种标签,用以描述特定应用程序信息。Xml文档可以包含多个针对不同应用程序的处理指令。处理指令由两部分组成,target和content。target的角色类似于“名称”,紧随target之后的字符串就是content,content可以包含多个标记。返回值类型: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值的根节点的属性。如果指定了一个版本,它会替换根节点的版本声明中的值、如果指定了一个独立设置、它会替换根节点的独立声明中的值。
返回值类型:xml
示例:
SELECT xmlroot('<?xml version="1.1"?><content>abc</content>',version '1.0', standalone yes);
返回结果为:
xmlroot -------------------------------------------------------------- <?xml version="1.0" standalone="yes"?><content>abc</content> (1 row)
-
描述:该函数是一个聚集函数、它将聚集函数调用的输入值串接起来,且支持跨行串接。
参数:xml
返回值类型:xml
示例:
1、创建测试表并插入数据。
CREATE TABLE xmltest (id int,data xml); INSERT INTO xmltest VALUES (1, '<value>one</value>'); INSERT INTO xmltest VALUES (2, '<value>two</value>');
2、调用xmlagg函数。
SELECT xmlagg(data) FROM xmltest;
返回结果为:
xmlagg -------------------------------------- <value>one</value><value>two</value> (1 row)
XML 谓词
下列函数用于检查xml值的属性。
xmlexists(text passing [BY REF] xml [BY REF])
描述:评价一个XPath 1.0表达式(第一个参数),以传递的XML值作为其上下文项。 如果评价的结果产生一个空节点集,该函数返回false,如果产生任何其他值,则返回true。 如果任何参数为空,则函数返回null。 作为上下文项传递的非空值必须是一个XML文档,而不是内容片段或任何非XML值。
参数:xml
返回值类型:bool
示例:
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类型格式、返回值为布尔类型。
参数:text
返回值类型:bool
示例:
SELECT xml_is_well_formed('<>');
返回结果为:
xml_is_well_formed -------------------- f (1 row)
xml_is_well_formed_document(text)
描述:检查text是不是正确的XML类型格式、返回值为布尔类型。
参数:text
返回值类型:bool
示例:
SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>');
返回结果为:
xml_is_well_formed_document ----------------------------- t (1 row)
xml_is_well_formed_content(text)
描述:检查text是不是正确的XML类型格式、返回值为布尔类型。
参数:text
返回值类型:bool
示例:
select xml_is_well_formed_content('k');
返回结果为:
xml_is_well_formed_content ---------------------------- t (1 row)
处理 XML
Vastbase提供了下列函数用于处理数据类型xml的值。
xpath相关函数仅支持 xpath() 和 xpath_exists()、由于其使用xpath语言查询XML文档,而这些函数都依赖于libxml2 库,且这个库仅在Xpath1.0提供、所以对XPath的限制为1.0。
xpath(xpath, xml [, nsarray])
描述:在XML值xml上计算XPath 1.0表达式xpath (a text value)。它返回一个XML值的数组,该数组对应于该XPath表达式产生的结点集合。如果该XPath表达式返回一个标量值而不是一个结点集合,将会返回一个单一元素的数组。
第二个参数必须是一个良构的XML文档。特殊地,它必须有一个单一根节点元素。
该函数可选的第三个参数是一个名字空间映射的数组。这个数组应该是一个二维text数组,其第二轴长度等于2(即它应该是一个数组的数组,其中每一个都由刚好 2 个元素组成)。每个数组项的第一个元素是名字空间的名称(别名),第二个元素是名字空间的URI。并不要求在这个数组中提供的别名和在XML文档本身中使用的那些名字空间相同(换句话说,在XML文档中和在xpath函数环境中,别名都是本地的)。
返回值类型:xml
示例:
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函数的一种特殊形式。这个函数不是返回满足XPath 1.0表达式的单一XML值,它返回一个布尔值表示查询是否被满足(具体来说,它是否产生了空节点集以外的任何值)。这个函数等价于标准的XMLEXISTS谓词,不过它还提供了对一个名字空间映射参数的支持。
返回值类型:bool
示例:
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)
将表映射到 XML
query_to_xml(query text, nulls boolean, tableforest boolean, targetns text)
描述:该函数将关系表的内容映射成 XML 值,可理解为XML的导出功能,由参数query传递的查询并且映射结果集。
返回值类型:xml
示例:示例中使用的xmltest表已创建,参考xmlagg示例。
select query_to_xml('select * from xmltest',true,true,'mydb');
返回结果为:
query_to_xml ---------------------------------------------------------------------- <row xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance" xmlns="mydb">+ + <id>1</id> + <data><value>one</value></data> + </row> + + <row xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance" xmlns="mydb">+ + <id>2</id> + <data><value>two</value></data> + </row> + + (1 row)
query_to_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
描述:返回 XML 模式文档,这些文档描述上述对应函数所执行的映射。
返回值:XML 模式文档
示例:把查询结果中的行转换成xml格式,示例中使用的xmltest表已创建,参考xmlagg示例。
select query_to_xmlschema('select * from xmltest',true,true,'mydb');
返回结果为:
query_to_xmlschema ------------------------------------------------------------------------------------------ <xsd:schema + xmlns:xsd="http://xxxxxx/2001/XMLSchema" + targetNamespace="mydb" + elementFormDefault="qualified"> + + <xsd:simpleType name="INTEGER"> + <xsd:restriction base="xsd:int"> + <xsd:maxInclusive value="2147483647"/> + <xsd:minInclusive value="-2147483648"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:complexType mixed="true"> + <xsd:sequence> + <xsd:any name="element" minOccurs="0" maxOccurs="unbounded" processContents="skip"/>+ </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="RowType"> + <xsd:sequence> + <xsd:element name="id" type="INTEGER" nillable="true"></xsd:element> + <xsd:element name="data" type="XML" nillable="true"></xsd:element> + </xsd:sequence> + </xsd:complexType> + + <xsd:element name="row" type="RowType"/> + + </xsd:schema> (1 row)
query_to_xml_and_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
描述:产生XML数据映射和对应的XML模式,并把产生的结果链接在一起放在一个文档中。
示例:把查询结果中行的定义和值转成xml格式。示例中使用的xmltest表已创建,参考xmlagg示例。
select query_to_xml_and_xmlschema('select * from xmltest',true,true,'mydb');
返回结果为:
query_to_xml_and_xmlschema ------------------------------------------------------------------------------------------ <xsd:schema + xmlns:xsd="http://xxxxxx/2001/XMLSchema" + targetNamespace="mydb" + elementFormDefault="qualified"> + + <xsd:simpleType name="INTEGER"> + <xsd:restriction base="xsd:int"> + <xsd:maxInclusive value="2147483647"/> + <xsd:minInclusive value="-2147483648"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:complexType mixed="true"> + <xsd:sequence> + <xsd:any name="element" minOccurs="0" maxOccurs="unbounded" processContents="skip"/>+ </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="RowType"> + <xsd:sequence> + <xsd:element name="id" type="INTEGER" nillable="true"></xsd:element> + <xsd:element name="data" type="XML" nillable="true"></xsd:element> + </xsd:sequence> + </xsd:complexType> + + <xsd:element name="row" type="RowType"/> + + </xsd:schema> + + <row xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance" xmlns="mydb"> + + <id>1</id> + <data><value>one</value></data> + </row> + + <row xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance" xmlns="mydb"> + + <id>2</id> + <data><value>two</value></data> + </row> + + (1 row)
cursor_to_xml(cursor refcursor, count int, nulls boolean,tableforest boolean, targetns text)
描述:该函数将关系表的内容映射成 XML 值,可理解为XML的导出功能,从cursor指定的游标中取出指定数量的行。
返回值类型:xml
示例:
1、创建测试表并插入数据。
CREATE TABLE xmltbl (a int,b text); INSERT INTO xmltbl VALUES (1,'one'),(2,'two'),(-1, null);
2、声明一个游标。
DECLARE XC CURSOR WITH HOLD FOR SELECT * FROM xmltbl ORDER BY 1,2;
3、调用cursor_to_xml函数。
SELECT cursor_to_xml('xc'::refcursor, 5, false, true,'');
返回结果为:
cursor_to_xml --------------------------------------------------------- <row xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance">+ + <a>-1</a> + </row> + + <row xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance">+ + <a>1</a> + <b>one</b> + </row> + + <row xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance">+ + <a>2</a> + <b>two</b> + </row> + + (1 row)
cursor_to_xmlschema(cursor refcursor, nulls boolean, tableforest boolean, targetns text)
描述:返回 XML 模式文档,这些文档描述上述对应函数所执行的映射。
返回值类型:xml
示例:示例中使用的游标xc已创建,参考cursor_to_xml示例。
SELECT cursor_to_xmlschema('xc'::refcursor, false, true,'');
返回结果为:
cursor_to_xmlschema ------------------------------------------------------------------------------------------ -- <xsd:schema + xmlns:xsd="http://xxxxxx/2001/XMLSchema"> + + <xsd:simpleType name="INTEGER"> + <xsd:restriction base="xsd:int"> + <xsd:maxInclusive value="2147483647"/> + <xsd:minInclusive value="-2147483648"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="UDT.vastbase.pg_catalog.text"> + <xsd:restriction base="xsd:string"> + </xsd:restriction> + </xsd:simpleType> + + <xsd:complexType name="RowType"> + <xsd:sequence> + <xsd:element name="a" type="INTEGER" minOccurs="0"></xsd:element> + <xsd:element name="b" type="UDT.vastbase.pg_catalog.text" minOccurs="0"></xsd:element >+ </xsd:sequence> + </xsd:complexType> + + <xsd:element name="row" type="RowType"/> + + </xsd:schema> (1 row)
schema_to_xml(schema name, nulls boolean, tableforest boolean, targetns text)
描述:把模式中的表映射成XML值。
返回值类型:xml
示例:
SELECT schema_to_xml('public', true, true,'');
schema_to_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
描述:把模式中的表映射成XML模式文档。
返回值类型:xml
示例:
select schema_to_xmlschema('public', true, true,'');
schema_to_xml_and_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
描述:把模式中的表映射成XML值和模式文档。
返回值类型:xml
示例:
select schema_to_xml_and_xmlschema('public', true, true,'');
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
table_to_xml(tbl regclass, nulls boolean, tableforest boolean, targetns text)
描述:该函数将关系表的内容映射成 XML 值,可理解为XML的导出功能,由参数tbl传递的命名表的内容,regclass类型接受使用常见标记标识表的字符串。
返回值类型:xml
示例:把表的内容转换成xml格式。示例中使用的xmltest表已创建,参考xmlagg示例。
select table_to_xml('xmltest'::regclass,true,true,'mydb');
返回结果为:
table_to_xml -------------------------------------------------------------------------------- <_x0078_mltest xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance" xmlns="mydb">+ + <id>1</id> + <data><value>one</value></data> + </_x0078_mltest> + + <_x0078_mltest xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance" xmlns="mydb">+ + <id>2</id> + <data><value>two</value></data> + </_x0078_mltest> + + (1 row)
table_to_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
描述:返回 XML 模式文档,这些文档描述上述对应函数所执行的映射。
返回值类型:xml
示例:把表的定义转换成xml格式。示例中使用的xmltest表已创建,参考xmlagg示例。
select table_to_xmlschema('xmltest'::regclass,true,true,'mydb');
返回结果为:
table_to_xmlschema ------------------------------------------------------------------------------------------ <xsd:schema + xmlns:xsd="http://xxxxxx/2001/XMLSchema" + targetNamespace="mydb" + elementFormDefault="qualified"> + + <xsd:simpleType name="INTEGER"> + <xsd:restriction base="xsd:int"> + <xsd:maxInclusive value="2147483647"/> + <xsd:minInclusive value="-2147483648"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:complexType mixed="true"> + <xsd:sequence> + <xsd:any name="element" minOccurs="0" maxOccurs="unbounded" processContents="skip"/>+ </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="RowType.vastbase.public._x0078_mltest"> + <xsd:sequence> + <xsd:element name="id" type="INTEGER" nillable="true"></xsd:element> + <xsd:element name="data" type="XML" nillable="true"></xsd:element> + </xsd:sequence> + </xsd:complexType> + + <xsd:element name="_x0078_mltest" type="RowType.vastbase.public._x0078_mltest"/> + + </xsd:schema> (1 row)
table_to_xml_and_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
描述:产生XML数据映射和对应的XML模式,并把产生的结果链接在一起放在一个文档中。
示例:把表的定义和表中的数据转换成xml格式。示例中使用的xmltest表已创建,参考xmlagg示例。
select table_to_xml_and_xmlschema('xmltest'::regclass,true,true,'mydb');
返回结果为:
table_to_xml_and_xmlschema ------------------------------------------------------------------------------------------ <xsd:schema + xmlns:xsd="http://xxxxxx/2001/XMLSchema" + targetNamespace="mydb" + elementFormDefault="qualified"> + + <xsd:simpleType name="INTEGER"> + <xsd:restriction base="xsd:int"> + <xsd:maxInclusive value="2147483647"/> + <xsd:minInclusive value="-2147483648"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:complexType mixed="true"> + <xsd:sequence> + <xsd:any name="element" minOccurs="0" maxOccurs="unbounded" processContents="skip"/>+ </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="RowType.vastbase.public._x0078_mltest"> + <xsd:sequence> + <xsd:element name="id" type="INTEGER" nillable="true"></xsd:element> + <xsd:element name="data" type="XML" nillable="true"></xsd:element> + </xsd:sequence> + </xsd:complexType> + + <xsd:element name="_x0078_mltest" type="RowType.vastbase.public._x0078_mltest"/> + + </xsd:schema> + + <_x0078_mltest xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance" xmlns="mydb"> + + <id>1</id> + <data><value>one</value></data> + </_x0078_mltest> + + <_x0078_mltest xmlns:xsi="http://xxxxxx/2001/XMLSchema-instance" xmlns="mydb"> + + <id>2</id> + <data><value>two</value></data> + </_x0078_mltest> + + (1 row)