xml格式相关函数
一、环境准备
先安装数据库。XML
相关函数在调用时会运行 idsxmlvp
虚拟进程类。在使用 xml
函数之前,要先创建 idsxmlvp
的虚拟进程。
查看 idsxmlvp
虚拟进程
在 gbase 8s
数据库服务器上用 gbasedbt
用户执行 onstat -g glo
语句,可以查询当前 idsxmlvp
个数。
新增 idsxmlvp
虚拟进程
新增虚拟进程有下面2种方法:
-
在
onconfig
文件中新增行VPCLASS idsxmlvp,num=1
并重启服务器。这种修改方式可以使配置参数永久生效。 -
在数据库运行状态下,使用
onmode -p +1 idsxmlvp
命令进行设置。这种修改方式临时生效,重启服务器后会失效。
开启允许换行参数
XML
格式的数据会包含多个元素,在数据库中可以由 XMLTYPE
类型、字符类型、 CLOB
类型存储。但 XML
数据格式会将一条数据分为多行展示,因此在插入字符类型时需要允许换行。默认情况下数据库安装时配置了此参数。如出现运行失败时,先检查 ONCONFIG
文件中的 ALLOW_NEWLINE
参数,1代表开启,0代表关闭。在参数关闭时,可由下面2种方式开启:
-
执行命令
EXECUTE PROCEDURE sys:ifx_allow_newline('t')
临时开启。 -
修改
ALLOW_NEWLINE
参数并重启服务器,使参数永久生效。
二、数据存储
XML
类型的数据可由 XMLTYPE
类型、字符类型、 CLOB
类型存储。
应用样例
> CREATE TABLE tab (col2 XMLtype);
Table created.
> INSERT INTO tab VALUES ('
<personnel>
<person id="Jason.Ma">
<name>
<family>Ma</family>
<given>Jason</given>
</name>
</person>
</personnel>');> > > > > > > >
1 row(s) inserted.
> CREATE TABLE tab1 (col2 lvarchar(200));
Table created.
INSERT INTO tab1 VALUES ('
<personnel>
<person id="Jason.Ma">
<name>
<family>Ma</family>
<given>Jason</given>
</name>
</person>
</personnel>');
1 row(s) inserted.
> CREATE TABLE tab2 (col2 CLOB);
Table created.
> insert into tab2 values(filetoclob('/home/gbasedbt/t1.xml','server'));
1 row(s) inserted.
> !cat /home/gbasedbt/t1.xml
<personnel>
<person id="Jason.Ma">
<name>
<family>Ma</family>
<given>Jason</given>
</name>
</person>
</personnel>
三、xml函数中的对于特殊字符的处理
在 XML
格式的数据中,如果存在产生歧义的字符,会导致格式不匹配。因此需要对这些特殊字符进行替换。特殊字符及对应关系如下:
符号 | xml数据中对应的格式 |
---|---|
小于(<) | < |
大于(>) | > |
双引号(") | " |
反引号(`) | ' |
and符(&) | & |
四、相关函数
在下面函数中。不以 CLOB
结尾的函数返回 LVARCHAR
类型,最大值是32739个字节。以 CLOB
结尾的函数返回 CLOB
类型。
extract和extractclob
功能描述
提取出 XML
格式的数据中满足 XPATH
表达式的 节点 。如果未找到匹配项,则函数返回空字符串。
语法定义
extract(xml_string,xpath_expression)
extractclob(xml_string,xpath_expression)
参数说明
xml_string
:待处理的字段。该字段中存储的数据是 XML
格式的字符串或者文档。
xpath_expression
:一个 XPATH
表达式。使用首斜杠指定绝对路径 。省略首斜杠表示相对于根节点的路径。
应用样例
> SELECT extract(col2, '/personnel/person[@id="Jason.Ma"]/name/given') as c1
FROM tab;
c1 <given>Jason</given>
existsnode
功能描述
判断 XML
格式的数据中是否存在 XPATH
指定的节点。如果找到一个或多个节点,则返回 1;否则,返回 0。
语法定义
existsnode(xml_string,xpath_expression)
参数说明
xml_string
:待处理的字段。该字段中存储的数据是 XML
格式的字符串或者文档。
xpath_expression
:一个 XPATH
表达式。使用首斜杠指定绝对路径。省略首斜杠指示相对于根节点的路径。
应用样例
> SELECT * from tab where existsnode(col2, '/personnel/person[@id="Jason.Ma"]/name')=1;
col2
<personnel>
<person id="Jason.Ma">
<name>
<family>Ma</family>
<given>Jason</given>
</name>
</person>
</personnel>
1 row(s) retrieved.
extractvalue和extractvalueclob
功能描述
提取出 XML
格式的数据中满足 XPATH
表达式的节点中的 值
语法定义
extractvalue(xml_string,xpath_expression)
extractvalueclob(xml_string,xpath_expression)
参数说明
xml_string
:待处理的字段。该字段中存储的数据是 XML
格式的字符串或者文档。
xpath_expression
:一个 xpath
表达式。使用首斜杠指定绝对路径。省略首斜杠指示相对于根节点的路径。
应用样例
> SELECT extractvalue(col2, '/personnel/person[@id="Jason.Ma"]/name/given') FROM tab;
(expression) Jason
1 row(s) retrieved.
>
genxml和genxmlclob
功能描述
将SQL语句查询出来的结果按照元素加列名转为 XML
格式的数据,会把查询出的一行数据作为一个节点( genxmlelem
函数会分成多个节点)。如果返回的值大于32739个字节,则需要使用 genxmlclob
函数。
语法定义
genxml(root_element,rows)
genxmlclob(root_element,rows)
参数说明
root_element
:表示待查询的表名或列名。当指定表名时返回所有列,当指定列名时返回指定列。单独指定列时需要加 row
关键字。
rows
:为 XML
的元素指定 节点 名称。
应用样例
> select * from t1;
c1 c2
2023-09-15 aaa
2023-09-12 bbb
2 row(s) retrieved.
> select genxml(t1,"row") as genxml from t1;
genxml <row c1="2023-09-15" c2="aaa"/>
<row c1="2023-09-12" c2="bbb"/>
1 row(s) retrieved.
> select genxml(row(c1),"row") from t1;
genxml <row c1="2023-09-15"/>
<row c1="2023-09-12"/>
1 row(s) retrieved.
补充-对 XML
结果排序
可以使用子查询内部排序的方式对查询输出的 XML
结果进行排序。
> select genxml(row(a1,a2),"row") from (select c1 ,c2 from t1 order by c1 ) as vt(a1,a2);
genxml <row a1="2023-09-12" a2="bbb"/>
<row a1="2023-09-15" a2="aaa"/>
1 row(s) retrieved.
> select genxml(row(a1,a2),"row") from (select c1 ,c2 from t1 order by c1 desc ) as vt(a1,a2);
genxml <row a1="2023-09-15" a2="aaa"/>
<row a1="2023-09-12" a2="bbb"/>
1 row(s) retrieved.
genxmlelem和genxmlelemclob
功能描述
将SQL语句查询出来的结果转为 XML
格式的数据,此函数会把一行数据分成多个节点( genxml
函数分为一个节点),每个列名作为一个节点名,列值作为节点值。如果返回的行大于32739个字节,则需要使用 genxmlelemclob
函数。
语法定义
genxmlelem(row,element)
genxmlelemclob(row,element)
参数说明
row
:表示待查询的表名或列名。当指定表名时返回所有列,当指定列名时返回指定列。
element
:包含结果集的元素。
应用样例
> select * from t1;
c1 c2
2023-09-15 aaa
2023-09-12 bbb
> select genxmlelem(t1,"t1") as genxmlelem from t1;
genxmlelem <t1>
<row>
<c1>2023-09-15</c1>
<c2>aaa</c2>
</row>
<row>
<c1>2023-09-12</c1>
<c2>bbb</c2>
</row>
</t1>
> select genxmlelem(row(c1),"c1") as genxmlelem from t1;
genxmlelem <c1>
<row>
<c1>09/15/2023</c1>
</row>
<row>
<c1>09/12/2023</c1>
</row>
</c1>
1 row(s) retrieved.
genxmlqueryhdr和genxmlqueryhdrclob
功能描述
将查询返回的结果转为 XML
格式,并为该结果添加标头。
语法定义
genxmlqueryhdr(row,query)
genxmlqueryhdrclob(row,query)
参数说明
row
:起始节点名称。
query
:返回结果集的sql查询语句。
应用样例
> select genxmlqueryhdr('manufact_set','SELECT * FROM t1') as xml from dual;
xml <?xml version="1.0" encoding="en_US.819" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<manufact_set>
<row>
<c1>2023-09-15</c1>
<c2>aaa</c2>
</row>
<row>
<c1>2023-09-12</c1>
<c2>bbb</c2>
</row>
</manufact_set>
1 row(s) retrieved.
genxmlquery和genxmlqueryclob
功能描述
返回不带有 XML
标头的XML
的结果集。
语法定义
genxmlquery(row,query)
genxmlqueryclob(row,query)
参数说明
row
:起始节点名称。
query
:返回结果集的sql查询语句。
应用样例
> select genxmlquery('manufact_set','SELECT * FROM t1') as xml from dual;
xml <manufact_set>
<row>
<c1>2023-09-15</c1>
<c2>aaa</c2>
</row>
<row>
<c1>2023-09-12</c1>
<c2>bbb</c2>
</row>
</manufact_set>
genxmlschema和genxmlschemaclob
功能描述
生成一个带有XMLschema
和XML
的结果集。XML Schema
的作用是定义 XML
文档的合法构建模块。
语法定义
genxmlschema(row,element)
genxmlschemaclob(row,element)
**参数说明 **
row
:起始节点名称。
element
:包含结果集的元素名称。
应用样例
> select * from t1;
c1 c2
2023-09-15 aaa
2023-09-12 bbb
2 row(s) retrieved.
> SELECT genxmlschema(t1, "t1") as genxmlschema FROM t1;
genxmlschema <?xml version="1.0" encoding="en_US.819" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.gbase.cn"
xmlns="http://www.gbase.cn"
ElementFormDefault="qualified">
<xs:element name="t1">
<xs:complexType>
<xs:sequence>
<xs:element name="c1" type="xs:date"/>
<xs:element name="c2" type="xs:varchar2(20)"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<t1>
<row>
<c1>2023-09-15</c1>
<c2>aaa</c2>
</row>
<row>
<c1>2023-09-12</c1>
<c2>bbb</c2>
</row>
</t1>
1 row(s) retrieved.
idsxmlparse
功能描述
分析数据是否符合 XML
类型的结构。符合结构则正常输出,否则报错。
语法定义
idsxmlparse(xml_document)
参数说明
xml_document
:需要分析的 XML
字符串或者文档。
应用样例
> SELECT idsxmlparse('<purchaseOrder poNo="124356">
<customerName>ABC Enterprises</customerName>
<itemNo>F123456</itemNo>
</purchaseOrder>')
AS PO from dual> > > > ;
po <purchaseOrder poNo="124356">
<customerName>ABC Enterprises</customerName>
<itemNo>F123456</itemNo>
</purchaseOrder>
> SELECT idsxmlparse('<purchaseOrder poNo="124356">
<customerName>ABC Enterprises</customerName>
<itemNo>F123456</itemNo>
</purchaseOrder')
AS PO from dual;
8355: Function (idsxmlparse) Error parsing the input XML document.
Error in line 5
Near character position 14
xsltransform和xsltransformAsClob
功能描述
将 XML
文档转换成与 XSL
文档格式一致的文档。转换后的格式包括但不限于XML、HTML、纯文本。
语法定义
xlstransform(xml_document,xsl_document)
参数说明
xml_document
:待转换的 XML
格式的字符或者文档。
xsl_document
:待应用的 XSL
格式的文档。
应用样例
下面例子中将 XML
格式的数据转化为 html
格式。
> CREATE TABLE XML_TAB (DOC_ID INTEGER, XML_DOC lvarchar(32739), XSL_DOC lvarchar(32739));
Table created.
INSERT INTO XML_TAB VALUES
(1,
'<?xml version="1.0"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation = "/home/steffen/xsd/xslt.xsd">
<student studentID="1" firstName="Steffen" lastName="Siegmund"
age="23" university="Rostock"/>
</students>',
'<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="headline"/>
<xsl:param name="showUniversity"/>
<xsl:template match="students">
<html>
<head/>
<body>
<h1><xsl:value-of select="$headline"/></h1>
<table border="1">
<th>
<tr>
<td width="80">StudentID</td>
<td width="200">First Name</td>
<td width="200">Last Name</td>
<td width="50">Age</td>
<xsl:choose>
<xsl:when test="$showUniversity =''true''">
<td width="200">University</td>
</xsl:when>
</xsl:choose>
</tr>
</th>
<xsl:apply-templates/>
</table>
</body>
</html>