DBMS_XSLPROCESSOR
功能描述
DBMS_XSLPROCESSOR内置包提供了一个界面来管理XML文档的内容和结构。
注意事项
该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
使用该内置包的功能需要配置python3环境并创建plpython3u插件,步骤参考python3环境配置。
子程序
表1 DBMS_XSLPROCESSOR支持的函数
函数 | 描述 |
---|---|
VALUEOF | 根据给定的匹配模式串检索第一个节点的值。 |
SELECTNODES | 从XML的DOM树中获取到指定的树节点列表。 |
VALUEOF
功能描述
该函数可以根据给定的匹配模式串检索第一个节点的值。
语法格式
DBMS_XSLPROCESSOR.VALUEOF(
n IN DBMS_XMLDOM.DOMNODE,
pattern IN VARCHAR2,
val OUT VARCHAR2,
namespace IN VARCHAR2 := NULL);
参数说明
n
被检索的节点。
pattern
用于匹配的模式。
val
节点值。
namespace
命名空间。
示例
前置步骤:
1、系统已经安装python3环境,以便后续创建plpython3u插件,参考python3环境配置。
2、使用安装Vastbase数据库的操作系统用户创建文件夹并进入。
mkdir /tmp/xmltest
cd /tmp/xmltest
3、创建xml文件。
vi book.xml
文件内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<!--this is a test about xml.-->
<booklist type="science and engineering">
<book category="math">
<title>learning math</title>
<author>Lisa</author>
<pageNumber>561</pageNumber>
</book>
<book category="Python">
<title>learning Python</title>
<author>Susan</author>
<pageNumber>600</pageNumber>
</book>
<book category="C++">
<title>learning C++</title>
<author>Mikes</author>
<pageNumber>562</pageNumber>
</book>
</booklist>
4、使用vsql工具连接至客户端。
vsql -d vastbase -p 5432 -r
5、创建plpython3u插件。
CREATE EXTENSION plpython3u;
6、创建directory。
create directory test_dir as '/tmp/xmltest';
7、设置serveroutput 为on(允许将dbms_output.put_line的输出信息输出至vsql的命令界面的屏幕上)。
set serveroutput on;
8、调用函数dbms_xslprocessor.valueof,入参节点为null。
DECLARE
parser dbms_xmlparser.parser;
doc dbms_xmldom.DOMDocument;
docnode dbms_xmldom.DOMnode;
nodelist DBMS_XMLDOM.DOMNodelist;
len int;
node dbms_xmldom.DOMnode;
title varchar2(100);
author varchar2(100);
begin
parser :=dbms_xmlparser.newParser;
dbms_xmlparser.setbasedir(parser,'test_dir');
dbms_xmlparser.parse(parser,'test_dir'||'/'||'book.xml');
--dbms_xmlparser.parse(parser,'book.xml');
doc :=dbms_xmlparser.getDocument(parser);
docnode :=dbms_xmldom.makenode(xmldom.getDocumentElement(doc));
nodelist :=DBMS_XMLDOM.getElementsByTagName(doc,'book');
len :=dbms_xmldom.getLength(nodelist);
for i in 0..len-1 loop
node :=dbms_xmldom.item(nodelist,i);
dbms_xslprocessor.valueof(node,'title/text()',title);
dbms_xslprocessor.valueof(node,'author/text()',author);
dbms_output.put_line('title:'||title||','||'author:'||author);
end loop;
dbms_xmlparser.freeparser(parser);
dbms_xmldom.freeDocument(doc);
end;
/
返回结果如下:
title:learning math , author:Lisa
title:learning Python , author:Susan
title:learning C++,author:Mike
ANONYMOUS BLOCK EXECUTE
SELECTNODES
功能描述
从XML的DOM树中获取到指定的树节点列表。
语法格式
DBMS_XSLPROCESSOR.SELECTNODES(
n IN DBMS_XMLDOM.DOMNODE,
pattern IN VARCHAR2,
namespace IN VARCHAR2 := NULL
)
RETURN DBMS_XMLDOM.DOMNODELIST;
参数说明
n
XML树的根节点DOMNode。
pattern
用户指定的表达式(用于获取指定节点)。
namespace
定义的命名空间。
示例
1、系统已经安装python3环境,以便后续创建plpython3u插件,参考python3环境配置。
2、使用vsql工具连接至客户端。
vsql -p vastbase -p 5432 -r
3、创建plpython3u插件。
CREATE EXTENSION plpython3u;
4、设置serveroutput 为on(允许将dbms_output.put_line的输出信息输出至vsql的命令界面的屏幕上)。
set serveroutput to on;
5、创建存储过程,在存储过程中使用DBMS_XSLPROCESSOR.SELECTNODES函数,从XML的DOM树中获取到指定的树节点列表信息并输出到屏幕上。
create procedure proc_test(nodename varchar2(20))
as
declare
x xmltype;
doc dbms_xmldom.DOMDocument;
node dbms_xmldom.DOMNODE;
nodelist DBMS_XMLDOM.DOMNodelist;
len int;
title varchar2(100);
author varchar2(100);
begin
x := xmltype(
'<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J.K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>'
);
doc := dbms_xmldom.newDomDocument(x);
node := dbms_xmldom.makenode(dbms_xmldom.getDocumentElement(doc));
nodelist := dbms_xslprocessor.selectnodes(node,nodename);
len := dbms_xmldom.getLength(nodelist);
for i in 0..len-1 loop
node := dbms_xmldom.item(nodelist, i);
dbms_xslprocessor.valueof(node, 'title/text()', title, null);
dbms_xslprocessor.valueof(node, 'author/text()', author, null);
dbms_output.put_line('title: ' || title || ', ' || 'author: ' || author);
end loop;
end;
/
6、调用存储过程。
call proc_test('book');
返回结果如下:
title: Everyday Italian, author: Giada De Laurentiis
title: Harry Potter, author: J.K. Rowling
proc_test
-----------
(1 row)