XML

​ 由于Oracle的xml函数要求某些参数类型是 XMLType,比如下面这个existsnode()函数:

原型:

EXISTSNODE(XMLType_instance, XPath_string [, namespace_string ])

示例:

SELECT existsnode(XMLType('<a><b>d</b></a>'), '/a') from dual;

​ UDB-TX Oracle兼容版本新增 XMLType 数据类型,作用是把用户提供的字符串转换成内部的xmltype类型。

提示

XML(eXtended Markup Language可扩展标记语言)是一种基于文本的,用于结构化任何可标记文档的格式语言。它是一种轻便的,可扩展的,标准的且简学易懂的保存数据的语言。

兼容函数如下

函数名 功能描述
extract(XML) 该函数用于返回XML节点路径下的相应内容, 其中参数XMLType_instance用于指定XMLType实例,Xpath_string用于指定XML节点路径
extractvalue 该函数提供对XML内容的检索功能,extractvalue只能返回一个节点的一个值。
existsnode 该函数用于检查XML内容是否符合指定的路径表达式。
deletexml 该函数用于删除指定路径的XML节点
appendchildxml 该函数用于在XML对象中插入子节点。 它接受一个XML对象和一个XML片段作为参数,并将XML片段作为子节点插入到XML对象中
updatexml 该函数用于更新特定XML相应的节点路径的内容
insertxmlbefore 该函数用于在XML中的指定路径前插入子节点
insertxmlafter 该函数用于在XML中的指定路径后插入子节点
insertchildxml 该函数用于向指定的XML路径中插入子节点
insertchildxmlbefore 该函数用于向指定的XML路径之前插入子节点
insertchildxmlafter 该函数用于向指定的XML路径之后插入子节点
xmlisvalid 该函数用于检查XML格式是否正确

用例

准备表与数据

unvdb=# set unvdb_compatible_mode to oracle;
SET
unvdb=# create table inaf(a int, b xmltype);
CREATE TABLE
unvdb=# insert into inaf values(1,xmltype('<a><b>100</b></a>'));
INSERT 0 1
unvdb=# insert into inaf values(2, '');
INSERT 0 1
unvdb=# select * from inaf;
 a |         b
---+-------------------
 1 | <a><b>100</b></a>
 2 |
(2 rows)
unvdb=# create table xmltest(id int, data XMLType);
CREATE TABLE
unvdb=# insert into xmltest values(1, '<value>one</value>');
INSERT 0 1
unvdb=# insert into xmltest values(2, '<value>two</value>');
INSERT 0 1
unvdb=# select * from xmltest;
 id |        data
----+--------------------
  1 | <value>one</value>
  2 | <value>two</value>
(2 rows)
unvdb=# create table xmlnstest(id int, data xmltype);
CREATE TABLE
unvdb=# INSERT INTO xmlnstest VALUES(1, xmltype('<soapenv:Envelope xmlns:soapenv#"http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ#"http://www.def.com" xmlns:web#"http://www.abc.com"><soapenv:Body><web:BBB><typ:EEE>41</typ:EEE><typ:FFF>42</typ:FFF></web:BBB></soapenv:Body></soapenv:Envelope>'));
INSERT 0 1

extract(XML)

UDB-TX# SELECT extract(XMLType('<AA><ID>1</ID></AA>'), '/AA/ID') from dual;
  extract
------------
 <ID>1</ID>
(1 row)

extractvalue

UDB-TX# SELECT extractvalue(XMLType('<a><b>100</b></a>'),'/a/b') from dual;
 extractvalue
--------------
 100
(1 row)

existsnode

unvdb=# SELECT existsnode(XMLType('<a><b>d</b></a>'), '/a/b') from dual;
 existsnode
------------
          1
(1 row)

deletexml

unvdb=# SELECT deletexml(XMLType('<test><value>oldnode</value><value>oldnode</value></test>'),  '/test/value') from dual;
 deletexml
-----------
 <test/>
(1 row)

appendchildxml

unvdb=# SELECT appendchildxml(XMLType('<test><value></value><value></value></test>'),  '/test/value', XMLTYPE('<name>newnode</name>')) from dual;
      appendchildxml
--------------------------
 <test>                  +
   <value>               +
     <name>newnode</name>+
   </value>              +
   <value>               +
     <name>newnode</name>+
   </value>              +
 </test>
(1 row)

updatexml

unvdb=# SELECT updatexml(xmltype('<value>one</value>'), '/value', xmltype('<newvalue>1111</newvalue>')) FROM dual;
         updatexml
---------------------------
 <newvalue>1111</newvalue>
(1 row)

insertxmlbefore

unvdb=# SELECT insertxmlbefore(XMLType('<a>222<b>100</b><b>200</b></a>'), '/a/b', XMLTYPE('<c>88</c>')) from dual;
                 insertxmlbefore
--------------------------------------------------
 <a>222<c>88</c><b>100</b><c>88</c><b>200</b></a>
(1 row)

insertxmlafter

unvdb=# SELECT insertxmlafter(XMLType('<a><b>100</b></a>'),'/a/b',XMLType('<c>88</c>')) from dual;
 insertxmlafter
----------------
 <a>           +
   <b>100</b>  +
   <c>88</c>   +
 </a>
(1 row)

insertchildxml

unvdb=# SELECT insertchildxml(XMLType('<a>one<b></b>three<b></b></a>'), '//b', 'name', XMLTYPE('<name>newnode</name>')) from dual;
                            insertchildxml
-----------------------------------------------------------------------
 <a>one<b><name>newnode</name></b>three<b><name>newnode</name></b></a>
(1 row)

insertchildxmlbefore

unvdb=# SELECT insertchildxmlbefore(XMLType('<a><b>100</b></a>'), '/a', 'b', XMLType('<c>88</c>')) from dual;
 insertchildxmlbefore
----------------------
 <a>                 +
   <c>88</c>         +
   <b>100</b>        +
 </a>
(1 row)

insertchildxmlafter

unvdb=# SELECT insertchildxmlafter(XMLType('<a><b>100</b></a>'), '/a', 'b', XMLType('<c>88</c>')) from dual;
 insertchildxmlafter
---------------------
 <a>                +
   <b>100</b>       +
   <c>88</c>        +
 </a>
(1 row)

xmlisvalid

unvdb=# SELECT xmlisvalid(XMLTYPE('<a>'));
xmlisvalid
------------
f
(1 row)

unvdb=# SELECT xmlisvalid(XMLTYPE('<a/>'));
xmlisvalid
------------
t
(1 row)