XML(Xtended Markup Language,可扩展标记语言)是一种基于文本、用于结构化可标记文档的格式语言,是一种轻便的、可扩展的、标准且简学易懂的保存数据的语言,起源于 SGML,并可模拟为树型。DM 提供了一些过程与函数用来解析和查询 XML 数据,目前 DM 支持解析的 XML 数据大小不得超过 500MB。
后文基于功能的不同,将 XML 相关的方法进行了分类:数据构造章节提供了基础的 XML 构造方法,用于存储和初始化 XML 数据;数据查询章节的方法能够查询 XML 数据指定路径下的结点或者值;数据修改章节提供的方法支持用户更新、插入或删除 XML 文档中的结点或属性;数据转换章节提供的方法将 XML 转换为其他格式,或对 XML 数据进行格式化处理。
22.1 数据构造
22.1.1 XMLPARSE
语法格式:
XMLPARSE ({DOCUMENT|CONTENT}<value_expr>[WELLFORMED])
图例:
功能说明:
XMLPARSE 用于解析 XMLTYPE 类型数据,亦即 value_expr 的值。当指定为 DOCUMENT 时,value_expr 被解析为只有一个根结点的标准 XML 文档;当指定为 CONTENT 时,value_expr 被解析为有效的 XML 值,value_expr 可以没有 XML 申明部分。若指定了 WELLFORMED 参数,则不对 XML 内容进行检查,否则会对内容的合法性进行检查,内容不合法则报错。
举例说明:
SELECT XMLPARSE(DOCUMENT '<a>good</a>' WELLFORMED);
查询结果如下:
<a>good</a>
22.1.2 XMLELEMENT
语法格式:
XMLELEMENT(<identifier> | EVALNAME <exp> [, XMLATTRIBUTES (<exp> [AS EVALNAME <exp>] |
[[AS] c_alias] {, AS EVALNAME <exp> | [AS] c_alias})][, {, }])
图例:
XML_attributes_clause
功能说明:
XMLELEMENT 用于将 exp 构建成 xml 数据类型元素,返回 xmltype 类型数据。当前将 XMLELEMENT 的功能拆分为三个子函数进行调用:XMLELEMENT:一个输入参数,用于创建 XML 元素结点;XMLATTRIBUTE:用于向 XML 元素结点添加属性;XMLCHILD:用于向 XML 元素结点添加孩子。
参数说明:
identifier:标识符。
exp:字符串类型的数据。
c_alias:列别名。
举例说明:
SELECT XMLELEMENT(DM, 'TXT1', 'TXT2') FROM DUAL;
查询结果如下:
行号 XMLCHILD(XMLCHILD(XMLELEMENT(DM),'TXT1',0),'TXT2',0)
---------- ----------------------------------------------------
1 <DM>TXT1TXT2</DM>
使用 XMLATTRIBUTES 子句。
CREATE TABLE TABLE1 (ID NUMBER(10), COL1 VARCHAR2(5));
INSERT INTO TABLE1 VALUES (1,'HELLO');
INSERT INTO TABLE1 VALUES (2,NULL);
COMMIT;
SELECT
XMLELEMENT("OUTER",
XMLFOREST(ID AS "ID"),
(CASE NVL(COL1,'NULL')
WHEN 'NULL' THEN XMLELEMENT(COL1, XMLATTRIBUTES('TRUE' AS "XSI:NIL"), NULL)
ELSE XMLFOREST(COL1 AS "COL1")
END)
)AS XML_TESTTEMP
FROM TABLE1
/
查询结果如下:
行号 XML_TESTTEMP
---------- ------------------------------------------------------
1 <OUTER>
<ID>1</ID>
<COL1>hello</COL1>
</OUTER>
2 <OUTER>
<ID>2</ID>
<COL1 XSI:NIL="TRUE"/>
</OUTER>
22.1.3 XMLFOREST
语法格式:
XMLFOREST(<exp> [AS <identifier>] {,<exp> [AS <identifier>]})
图例:
功能说明:
XMLFOREST 用于将 exp 构建成 xml 数据类型元素,返回 xmltype 类型数据。当 exp 为列名时,可以省略标识符,此时将列名作为标识符,并将该列的查询结果作为字符串类型数据,其他情况不能省略标识符。
参数说明:
exp:字符串类型的数据。
identifier:标识符。
举例说明:
exp 不为列名,不能省略标识符:
SELECT XMLFOREST('TXT1' AS A, 'TXT2' AS B) FROM DUAL;
查询结果如下:
行号 XMLFOREST('TXT1'ASA,'TXT2'ASB)
---------- --------------------
1 <A>TXT1</A><B>TXT2
exp 为列名,可以省略标识符,省略后将列名作为标识符:
CREATE TABLE TEST(C1 INT,C2 VARCHAR);
INSERT INTO TEST VALUES(1, 'TXT');
SELECT XMLFOREST(C1,C2) FROM TEST;
查询结果如下:
行号 XMLFOREST(C1,C2)
---------- --------------------
1 <C1>1</C1><C2>TXT</C2>
22.1.4 XMLAGG
语法格式:
XMLAGG(<XMLdata>[<ORDER BY 子句>])
图例:
功能说明:
XMLAGG 函数,拼接 xml 数据。
参数说明:
XMLdata:待拼接的数据。
ORDER BY 子句:请参考第 4 章 数据查询语句。
举例说明:
CREATE TABLE X (A varchar(10),B int);
INSERT INTO X values('aaa',3);
INSERT INTO X values('bb',2);
insert into X values('c',1);
select XMLAGG(XMLPARSE(content A WELLFORMED) order by B) from X;
查询结果如下:
cbbaaa
22.1.5 FOR XML PATH
语法格式:
FOR XML PATH (<exp>)
图例:
功能说明:
FOR XML PATH 用于将 SQL 查询结果转换为 XML 格式,用户可指定行结点名称,并通过列别名定义元素结点。
参数说明:
<exp>:字符串类型的数据。
举例说明:
例 1 通过 PATH('row')指定行结点名称,元素结点默认使用列名:
CREATE TABLE test_forxmlpath(id INT ,name VARCHAR);
INSERT INTO test_forxmlpath VALUES(1 ,'aaa');
INSERT INTO test_forxmlpath VALUES(2 ,'bbb');
SELECT * FROM test_forxmlpath FOR XML PATH('row');
查询结果如下:
行号 ##TMP_COL_FOR_XML_PATH
---- ----------------------------------------------------------------------
1 <row>
<ID>1</ID>
<NAME>aaa</NAME>
</row><row>
<ID>2</ID>
<NAME>bbb</NAME>
</row>
例 2 通过列别名定义元素结点:
CREATE TABLE test_forxmlpath_1(id int ,name varchar);
INSERT INTO test_forxmlpath_1 VALUES(1 ,'aaa');
INSERT INTO test_forxmlpath_1 VALUES(2 ,'bbb');
SELECT id AS "id_num", name AS "name_str" FROM test_forxmlpath_1 FOR XML PATH('row');
查询结果如下:
行号 ##TMP_COL_FOR_XML_PATH
------ -------------------------------------------------------------
1 <row>
<id_num>1</id_num>
<name_str>aaa</name_str>
</row><row>
<id_num>2</id_num>
<name_str>bbb</name_str>
</row>
22.2 数据查询
22.2.1 SF_XMLQUERY
定义:
CLOB
SF_XMLQUERY(
xmldata clob,
xpath clob
)
功能说明:
解析 xmldata 并查询指定路径 xpath 下的数据。本方法的功能可由 XMLQUERY 代替,不再推荐使用。
参数说明:
xmldata:待解析的 XML 数据。
xpath:XML 路径。
返回值:
解析得到的 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。
举例说明:
SELECT SF_XMLQUERY('<a><b>b</b></a>', '/a');
查询结果如下:
<a>
<b>b</b>
</a>
22.2.2 XMLQUERY
定义:
CLOB
XMLQUERY(
xmldata clob,
xpath varchar
)
功能说明:
解析 xmldata 并查询指定路径 xpath 下的数据。
参数说明:
xmldata:待解析的 XML 数据。
xpath:XML 路径。
返回值:
解析得到的 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。
举例说明:
SELECT XMLQUERY('<a><b>b</b></a>', '/a');
查询结果如下:
<a>
<b>b</b>
</a>
22.2.3 XMLTABLE
语法格式:
XMLTABLE([<namespace_clause>,]<xmlpath> PASSING <xmldata> [COLUMNS <xmlcoldef_lst>])
<namespace_clause>::=XMLNAMESPACE( <string> AS "<id>"{, <string> AS "<id>"})
图例:
<namespace_clause>
功能说明:
查询 XML 数据在指定路径下的结点,并将结果按照关系表的方式展示。
需要注意的是,当 INI 参数 COMPATIBLE_MODE 不为 2 时,输出的 XML 数据结果将会自动换行;当 INI 参数 COMPATIBLE_MODE=2 时,输出的 XML 数据结果将不会自动换行。
参数说明:
namespaces:表示命名空间。
string:表示字符串类型数据。
id:表示标识符。
xmlpath:XML 数据的路径。
xmldata:XMLTYPE 类型数据。
xmlcoldef_lst:列定义列表。
举例说明:
例 1 获取 XML 数据在指定路径下的结点。
CREATE TABLE T3(C1 VARCHAR);
SF_SET_SESSION_PARA_VALUE('ENABLE_TABLE_EXP_REF_FLAG', 1); //开启同层列引用参数。SELECT语句中T3.C引用了同层表T3的列。
INSERT INTO T3 VALUES('<A><标签 属性="属性名">HELLO</标签></A>');
SELECT X1,X2 FROM T3, XMLTABLE('/A/标签' PASSING T3.C1 COLUMNS X1 VARCHAR(12) PATH '@属性', X2 VARCHAR(12) PATH 'text()');
查询结果如下:
行号 X1 X2
------- ------ -----
1 属性名 HELLO
支持多个命名空间。
SELECT * FROM XMLTABLE(XMLNAMESPACES('hxtp://www.a.com' AS "d",'hxtp://www.a.com' AS "f"), '/a' PASSING XMLTYPE('<a ibm:id="123" xmlns:ibm="hxtp://www.a.com" ><ibm:b>textaaa</ibm:b></a>') columns id varchar(20) path '/a/f:b');
查询结果如下:
行号 ID
---------- -------
1 textaaa
例 2 对比在 INI 参数 COMPATIBLE_MODE 为 2 与非 2 情况下的返回结果。
SELECT * FROM XMLTABLE('/wor/ins'
PASSING XMLtype('<wor>
<ins>
<joi id="15">
<result id="39" s="38">
</result>
</joi>
<joi id="55">
<result id="58" s="22">
</result>
</joi>
</ins>
</wor>
') COLUMNS result XMLtype PATH 'joi');
当 INI 参数 COMPATIBLE_MODE=0 时,查询结果如下:
RESULT
-------------------
<joi id="15">
<result id="39" s="38">
</result>
</joi>
<joi id="55">
<result id="58" s="22">
</result>
</joi>
当 INI 参数 COMPATIBLE_MODE=2 时, 查询结果如下:
RESULT
-------------------
<joi id="15"><result id="39" s="38">
</result></joi><joi id="55"><result id="58" s="22">
</result></joi>
22.2.4 EXISTSNODE
定义:
INT
EXISTSNODE(
xmldata clob,
xpath varchar
)
或
INT
EXISTSNODE(
xmldata clob,
xpath varchar,
xmlns varchar
)
功能说明:
xmldata 中是否存在指定的路径结点,若存在则返回 1,不存在返回 0。
参数说明:
xmldata:待解析的XML数据。
xpath:XML路径。
xmlns: XML命名空间。
返回值:
1 代表结点存在,0 代表结点不存在。xmldata 为 NULL 的情况下一律返回 0,xpath 为 NULL 的情况下一律返回 NULL。
举例说明:
例 1 指定 xmldata 和 xpath 参数执行 EXISTSNODE。
SELECT EXISTSNODE('<a><b>b</b></a>', '/a');
查询结果如下:
1
例 2 指定 xmldata、xpath 和 xmlns 参数执行 EXISTSNODE。
SELECT EXISTSNODE('<a xmlns:ns1="http://localhost:8080/source">
<ns1:b>First-202503172548153</ns1:b></a>',
'/a/ns1:b',
'xmlns:ns1="http://localhost:8080/source"');
查询结果如下:
1
22.2.5 EXTRACTVALUE
定义:
VARCHAR
EXTRACTVALUE(
xmldata clob,
xpath varchar
)
或
VARCHAR
EXTRACTVALUE(
xmldata clob,
xpath varchar,
xmlns varchar
)
功能说明:
获取 xmldata 中指定路径下的结点值,若路径下不止一个结点,或者结点不是叶子结点,将报错处理。
参数说明:
xmldata:待解析的XML数据。
xpath:XML路径。
xmlns:XML命名空间。
返回值:
获取的结点值。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。
举例说明:
例 1 指定 xmldata 和 xpath 参数执行 EXTRACTVALUE 函数获取指定结点路径下的值。
SELECT EXTRACTVALUE('<a><b>b</b></a>', '/a/b');
查询结果如下:
b
例 2 指定 xmldata、xpath 和 xmlns 参数执行 EXTRACTVALUE 函数获取指定结点路径下的值。
SELECT EXTRACTVALUE('<a xmlns:ns1="http://localhost:8080/source">
<ns1:b>First-202503172548153</ns1:b></a>',
'/a/ns1:b',
'xmlns:ns1="http://localhost:8080/source"');
查询结果如下:
First-202503172548153
22.2.6 XMLSEQUENCE
语法格式:
XMLSEQUENCE (EXTRACT ( <xmldata>, <xmlpath> [, <xmlnamespace>]) )
图例:
功能说明:
XMLSEQUENCE 用于获取指定路径 xmlpath 下不同结点的 XML 数据,并将结点数据集合转换为行集合,通常与 TABLE 函数和 EXTRACT 函数结合使用。
参数说明:
xmlpath:XML 数据的路径。
xmldata:XMLTYPE 类型数据。
xmlnamespace:表示命名空间,通常为字符串类型数据。
举例说明:
例 1 指定 XMLDATA 和 XPATH 参数执行 XMLSEQUENCE。
SELECT TAB.* FROM TABLE(XMLSEQUENCE(EXTRACT('<a><b>First-202503172548153</b></a>', '/a/b'))) TAB;
查询结果如下:
行号 COLUMN_VALUE
---------- ----------------------------
1 <b>First-202503172548153</b>
例 2 指定 xmldata、xpath 参数执行 XMLSEQUENCE,如果 xpath 存在命名空间且未指定命名空间参数将报错。
SELECT TAB.* FROM TABLE(XMLSEQUENCE(EXTRACT('<a xmlns:ns1="http://localhost:8080/source"><ns1:b>First-202503172548153</ns1:b></a>', '/a/ns1:b'))) TAB;
查询结果报错:
-9903: XML执行异常 [Undefined namespace prefix]
例 3 指定 xmldata、xpath、xmlnamespace 参数执行 XMLSEQUENCE,。
SELECT TAB.* FROM TABLE(XMLSEQUENCE(EXTRACT('<a xmlns:ns1="http://localhost:8080/source"><ns1:b>First-202503172548153</ns1:b></a>', '/a/ns1:b', 'xmlns:ns1="http://localhost:8080/source"'))) TAB;
查询结果如下:
行号 COLUMN_VALUE
----- ---------------------------------------------------------------
1 <ns1:b xmlns:ns1="http://localhost:8080/source">First-202503172548153</ns1:b>
22.2.7 EXTRACT
语法格式:
语法 1:
EXTRACT (<xmldata>, <xmlpath>[, <xmlnamespace>] )
语法 2:
<xmldata>.EXTRACT(<xmlpath>[, <xmlnamespace>] )
图例:
语法 1:
语法 2:
功能说明:
EXTRACT 用于从 XML 文档中提取符合 xpath 表达式的结点或片段,如果 xpath 中存在命名空间,则需要指定命名空间。
参数说明:
xmlpath:XML 数据的路径。
xmldata:XMLTYPE 类型数据。
xmlnamespace:表示命名空间,通常为字符串类型数据。
举例说明:
例 1 指定 xmldata 和 xpath 参数执行 EXTRACT,以下两种调用方式获得的结果一致。
//使用语法1
SELECT EXTRACT(XMLTYPE('<?xml version="1.0" encoding="utf-8"?><Envelope><Body><root><result></result></root></Body></Envelope>'),'/Envelope/Body') AS RESULT FROM DUAL;
//使用语法2
SELECT XMLTYPE('<?xml version="1.0" encoding="utf-8"?><Envelope><Body><root><result></result></root></Body></Envelope>').EXTRACT('/Envelope/Body') AS RESULT FROM DUAL;
查询结果如下:
行号 RESULT
---------- -----------------------------------------------
1 <Body>
<root>
<result/>
</root>
</Body>
例 2 指定 xmldata、xpath、xmlnamespace 参数执行 EXTRACT,以下两种方式均可获得结果。
//使用语法1
SELECT EXTRACT(XMLTYPE('<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><Body><ns1:root xmlns:ns1="http://imageCenter.web.com"><result></result></ns1:root></Body></soapenv:Envelope>'),'/soapenv:Envelope/Body', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"') AS RESULT FROM DUAL;
//使用语法2
SELECT XMLTYPE('<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><Body><ns1:root xmlns:ns1="http://imageCenter.web.com"><result></result></ns1:root></Body></soapenv:Envelope>').EXTRACT('/soapenv:Envelope/Body', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"') AS RESULT FROM DUAL;
查询结果如下:
行号 RESULT
-----------------------------------------------------------------------
1 <Body>
<ns1:root xmlns:ns1="http://imageCenter.web.com">
<result/>
</ns1:root>
</Body>
22.3 数据修改
22.3.1 DELETEXML
定义:
CLOB
DELETEXML(
xmldata clob,
xpath varchar
)
功能说明:
从 xmldata 中删除 xpath 路径下的结点。
参数说明:
xmldata:XML 数据。
xpath:XML 路径。
返回值:
删除结点后的 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。
举例说明:
SELECT deleteXML('<a><b2>地方<c>d</c></b2><b2>dd</b2></a>', 'a/b2/c');
查询结果如下:
<a>
<b2>地方</b2>
<b2>dd</b2>
</a>
22.3.2 APPENDCHILDXML
定义:
CLOB
APPENDCHILDXML(
xmldata clob,
xpath varchar,
child clob
)
功能说明:
将 child 结点插入到 xmldata 的 xpath 下的结点中,并将插入结点后的新 xmldata 返回。
参数说明:
xmldata:源XML数据。
xpath:XML路径。
child:指定的待插入结点。
返回值:
插入结点后的新 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。如果 child 为 NULL 则不会进行添加子结点操作。
举例说明:
SELECT APPENDCHILDXML('<a><b>b</b></a>', '/a', '<d>xxx</d>');
查询结果如下:
<a>
<b>b</b>
<d>xxx</d>
</a>
22.3.3 INSERTCHILDXML
定义:
CLOB
INSERTCHILDXML(
xmldata clob,
xpath varchar,
exp varchar,
insnode clob
)
功能说明:
将 insnode 结点插入到 xmldata 的 xpath 路径下,其中 insnode 结点名必须与 exp 保持一致。
参数说明:
xmldata:XML 数据。
xpath:XML 路径。
exp:结点名。
insnode:待插入的 XML 结点。
返回值:
已插入结点后的 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。如果 exp 或 insnode 为 NULL 将报错参数非法。
举例说明:
SELECT INSERTchildXML('<a><b2>地方</b2><b2>dd</b2></a>', 'a/b2','c', xmltype('<c>china</c>'));
查询结果如下:
<a>
<b2>地方<c>china</c></b2>
<b2>dd<c>china</c></b2>
</a>
22.3.4 INSERTCHILDXMLAFTER
定义:
CLOB
INSERTCHILDXMLAFTER(
xmldata clob,
xpath varchar,
exp varchar,
insnode clob
)
功能说明:
将 insnode 结点插入到 xmldata 的 xpath 路径下 exp 子结点后面。
参数说明:
xmldata:XML 数据。
xpath:XML 路径。
exp:xpath 下的子结点名,insonde 在此结点之后插入。
insnode:待插入的 XML 结点。
返回值:
已插入结点后的 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。如果 exp 为 NULL 将报错参数非法。如果 insnode 为 NULL 则不会进行插入子结点操作。
举例说明:
SELECT INSERTchildXMLafter('<a><b2>地方</b2><b2>dd</b2></a>', 'a/','b2', xmltype('<c>china</c>'));
查询结果如下:
<a>
<b2>地方</b2>
<c>china</c>
<b2>dd</b2>
<c>china</c>
</a>
22.3.5 INSERTCHILDXMLBEFORE
定义:
CLOB
INSERTCHILDXMLBEFORE (
xmldata clob,
xpath varchar,
exp varchar,
insnode clob
)
功能说明:
将 insnode 结点插入到 xmldata 的 xpath 路径下 exp 子结点前面。
参数说明:
xmldata:XML 数据。
xpath:XML 路径。
exp:xpath 下的子结点名,insonde 在此结点之前插入。
insnode:待插入的 XML 结点。
返回值:
已插入结点后的 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。如果 exp 为 NULL 将报错参数非法。如果 insnode 为 NULL 则不会进行插入子结点操作。
举例说明:
SELECT INSERTchildXMLbefore('<a><b2>地方</b2><b2>dd</b2></a>', 'a/','b2', xmltype('<c>china</c>'));
查询结果如下:
<a>
<c>china</c>
<b2>地方</b2>
<c>china</c>
<b2>dd</b2>
</a>
22.3.6 INSERTXMLBEFORE
定义:
CLOB
INSERTXMLBEFORE(
xmldata clob,
xpath varchar,
insnode clob
)
功能说明:
将 insnode 结点插入到 xmldata 的 xpath 路径下 exp 结点前面。
参数说明:
xmldata:XML 数据。
xpath:XML 路径。
insnode:待插入的 XML 结点。
返回值:
已插入结点后的 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。如果 insnode 为 NULL 则不会进行插入子结点操作。
举例说明:
SELECT INSERTXMLbefore('<a><b2>hello</b2><b2>dd</b2></a>', '/a/b2[1]', xmltype('<c>china</c>'));
查询结果如下:
<a>
<c>china</c>
<b2>hello</b2>
<b2>dd</b2>
</a>
22.3.7 INSERTXMLAFTER
定义:
CLOB
INSERTXMLAFTER(
xmldata clob,
xpath varchar,
insnode clob
)
功能说明:
将 insnode 结点插入到 xmldata 的 xpath 路径下 exp 结点后面。
参数说明:
xmldata:XML 数据。
xpath:XML 路径。
insnode:待插入的 XML 结点。
返回值:
已插入结点后的 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。如果 insnode 为 NULL 则不会进行插入子结点操作。
举例说明:
SELECT INSERTXMLAFTER(xmltype('<a><b2>地方</b2><b2>dd</b2></a>'), 'a/b2', xmltype('<c>china</c>'));
查询结果如下:
<a>
<b2>地方</b2>
<c>china</c>
<b2>dd</b2>
<c>china</c>
</a>
22.3.8 UPDATEXML
定义:
CLOB
UPDATEXML(
xmldata clob,
xpath varchar,
updnode clob
)
功能说明:
用 updnode 替换 xmldata 的 xpath 路径下结点。
参数说明:
xmldata:XML 数据。
xpath:XML 路径。
updnode:用于替换的 XML 结点。
返回值:
更新结点后的 XML 数据。xmldata 或 xpath 为 NULL 的情况下一律返回 NULL。如果 insnode 为 NULL 会将指定路径下结点的子结点替换为空结点。
举例说明:
SELECT UPDATEXML('<a><a1>d1</a1><a2>d2</a2></a>', '/a/a2', '<x>f</x>');
查询结果如下:
<a>
<a1>d1</a1>
<x>f</x>
</a>
22.4 数据转换
22.4.1 XMLTRANSFORM
定义:
CLOB
XMLTRANSFORM(
xmldata clob,
xslt clob
)
功能说明:
将 xmldata 中的内容按照 xslt 中指定的格式生成一个新的 xml 数据。使用 xmltransform 须遵循 xslt 标准,DM 通过引入第三方库 libxslt 来支持 xslt 标准,使用时需要保证有 libxslt 库。
参数说明:
xmldata:XML 数据。
xslt:表单格式。
返回值:
变换后的新 XML 数据。
举例说明:
DECLARE
xmldata clob;
xslt clob;
BEGIN
xmldata :='
<s1 title="s1 foo">
<s2 title="Foo">
<p>Hello</p>
</s2>
</s1>';
xslt := '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="s1">
<html>
<head><title><xsl:value-of select="@title"/></title></head>
<body>
<xsl:apply-templates select="s2"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>';
select xmltransform(xmldata, xslt);
END;
查询结果如下:
XMLTRANSFORM(XMLDATA,XSLT)
----------------------------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>s1 foo</title>
</head>
<body>Hello</body>
</html>
22.4.2 XMLSERIALIZE
语法格式:
XMLSERIALIZE(<DOCUMENT | CONTENT> <value_expr> [AS <datatype>] [ENCODING <xml_encoding_spec>] [VERSION <string_literal>] [<NO INDENT> | <INDENT [SIZE = <number>]>] [<HIDE | SHOW> DEFAULTS])
图例:
功能说明:
XMLSERIALIZE 用于将 xml 实例按照指定的选项进行格式化输出。
参数说明:
<datatype>:仅支持 VARCHAR、BLOB、CLOB 三种数据类型。
<xml_encoding_spec>:字符串类型,用于指定输出串的编码,目前支持指定为 GBK、GB18030、UTF-8。仅在 datatype 为 BLOB 时可指定 ENCODING <xml_encoding_spec> 语句。
<string_literal>:字符串类型,设置 xml 版本类型,不作合法性校验。
<number>:整型数字,表示结点缩进格式。默认没有格式缩进,该参数取值不超过 20,即缩进不能超过 20。
<HIDE|SHOW> DEFAULTS:为语法兼容项,暂无实际意义。
举例说明:
例 1 指定为 CLOB 类型进行输出。
SELECT XMLSERIALIZE(content xmltype('<?xml version="1.1" encoding="GB18030"?> <a><c><x>d</x></c></a>') as Clob version '1.2' indent size = 10) AS xmlserialize_doc from dual;
查询结果如下:
行号 XMLSERIALIZE_DOC
---------- -----------------------------------------------------------------------------
1 <?xml version="1.2" encoding="GB18030"?>
<a>
<c>
<x>d</x>
</c>
</a>
例 2 指定为 BLOB 类型进行输出。
SELECT XMLSERIALIZE(content xmltype('<?xml version="1.1" encoding="UTF-8"?> <a><c><x>d</x></c></a>') as Blob ENCODING 'UTF8' version '1.2' indent size = 10) AS xmlserialize_doc from dual;
查询结果如下:
行号 XMLSERIALIZE_DOC
---------- ------------------------------------------------------------------------
1 0x3C3F786D6C2076657273696F6E3D22312E322220656E636F64696E673D225554462D38223F3E0A3C613E0A202020202020202020203C633E0A20202020202020202020202020202020202020203C783E643C2F783E0A202020202020202020203C2F633E0A3C2F613E0A
22.4.3 XMLCAST
语法格式:
XMLCAST(exp AS type)
图例:
功能说明:
XMLCAST 用于将 exp 构建的 xml 数据中的 content 内容转换为指定类型输出。
参数说明:
exp:XMLTYPE 类型的数据。
type:指定类型。
返回值:
转换为指定类型的 xml 数据。exp 为 NULL 的情况下一律返回 NULL。
举例说明:
SELECT XMLCAST(XMLType( '<test><a>Hello</a><b> World</b>!</test>' ) AS varchar2(100)) AS XML_TO_VARCHAR2 FROM DUAL;
查询结果如下:
行号 XML_TO_VARCHAR2
---------- --------------------
1 Hello World!