DBE_XMLPARSER
接口介绍
DBE_XMLPARSER用于将xml字符串反序列化,将存储xml文档的字符串转换为document节点。高级包DBE_XMLPARSER支持的所有接口请参见表1。
XMLPARSER数据类型可以被用来存储XMLPARSER数据,存储Xmlparser的数量上限为16777215。XMLPARSER数据类型能够根据输入的字符串解析建立domdocument节点,高级包还提供相应的set、get型接口,对解析过程的约束属性进行操作。
DBE_XMLPARSER高级包在字符集设置为SQL_ASCII的数据库内使用的情况下,传入超出ASCII范围的字符,会导致报错。
DBE_XMLPARSER高级包只支持O兼容模式。
接口名称 |
描述 |
---|---|
释放PARSER。 |
|
获取解析的document节点。 |
|
获取validate属性。 |
|
新建PARSER实例。 |
|
解析VARCHAR字符串。 |
|
解析CLOB字符串。 |
|
设置validate属性。 |
- DBE_XMLPARSER.FREEPARSER
DBE_XMLPARSER.FREEPARSER的存储过程原型为:
1 2
DBE_XMLPARSER.FREEPARSER ( p IN parser);
表2 DBE_XMLPARSER.FREEPARSER接口参数说明 参数
描述
p
指定的parser类型对象。
示例:1 2 3 4 5 6 7 8 9
-- 新建parser ,随后释放。 DECLARE l_parser dbe_xmlparser.parser; BEGIN l_parser := dbe_xmlparser.newparser(); -- 直接释放l_parser实例 dbe_xmlparser.freeparser(l_parser); END; /
执行结果:执行成功
- DBE_XMLPARSER.GETDOCUMENT
GETDOCUMENT返回PARSER构建的DOM树文档的根节点。只有在解析文档后,才能调用此函数。
DBE_XMLPARSER.GETDOCUMENT的函数原型为:
1 2 3
DBE_XMLPARSER.GETDOCUMENT ( p IN parser) RETURN DOMDocument;
表3 DBE_XMLPARSER.GETDOCUMENT接口参数说明 参数
描述
p
指定的parser类型对象。
- GETDOCUMENT函数无传入参数,报错。
- GETDOCUMENT函数参数parser传入为空,返回null。
- GETDOCUMENT函数传入的parser还没有解析文档,返回null。
示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
-- 新建parser解析字符串,GETDOCUMENT获取文档打印出来。 DECLARE l_parser dbe_xmlparser.parser; l_doc dbe_xmldom.domdocument; buffer varchar2 := '<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Donot forget me this weekend!</body> </note>'; buffer2 varchar2; BEGIN l_parser := dbe_xmlparser.newparser(); -- l_parser解析字符串,通过GETDOCUMENT获取domdocument节点 dbe_xmlparser.PARSEBUFFER(l_parser, buffer); l_doc := dbe_xmlparser.getdocument(l_parser); --将l_doc中的内容打印出来 dbe_xmldom.writetobuffer(l_doc, buffer2); RAISE NOTICE '%', buffer2; dbe_xmlparser.freeparser(l_parser); dbe_xmldom.freedocument(l_doc); END; /
执行结果:
1 2 3 4 5 6 7
NOTICE: <?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Donot forget me this weekend!</body> </note>
-
DBE_XMLPARSER.GETVALIDATIONMODE
获取给定Parser的解析验证模式。如果DTD验证开启返回TRUE,否则返回FALSE。
DBE_XMLPARSER.GETVALIDATIONMODE的函数原型为:
1 2 3
DBE_XMLPARSER.GETVALIDATIONMODE ( p IN parser) RETURN BOOLEAN;
表4 DBE_XMLPARSER.GETVALIDATIONMODE接口参数说明 参数
描述
p
指定的parser类型对象。
示例:1 2 3 4 5 6 7 8 9 10 11 12 13
-- 新建parser,通过GETVALIDATIONMODE获取parser解析验证模式是否打开。 DECLARE l_parser dbe_xmlparser.parser; BEGIN l_parser := dbe_xmlparser.newparser(); if (dbe_xmlparser.GETVALIDATIONMODE(l_parser) = true) then RAISE NOTICE 'validation'; else RAISE NOTICE 'no validation'; end if; dbe_xmlparser.freeparser(l_parser); END; /
执行结果:
1
NOTICE: validation
-
新建Parser对象,返回一个新的解析器实例。
DBE_XMLPARSER.NEWPARSER的函数原型为:
1 2
DBE_XMLPARSER.NEWPARSER RETURN Parser;
示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
-- 新建parser解析字符串,随后释放。 DECLARE -- Create a parser. l_parser dbe_xmlparser.parser; l_doc dbe_xmldom.domdocument; buffer varchar2(1000) := '<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Donot forget me this weekend!</body> </note>'; buffer2 varchar2(1000); BEGIN l_parser := dbe_xmlparser.newparser(); -- Parse the document and create a new DOM document. dbe_xmlparser.PARSEBUFFER(l_parser, buffer); dbe_xmlparser.freeparser(l_parser); END; /
执行结果:执行成功
- DBE_XMLPARSER.PARSEBUFFER
DBE_XMLPARSER.PARSEBUFFER的存储过程原型为:
1 2 3
DBE_XMLPARSER.PARSEBUFFER ( p IN parser, doc IN VARCHAR2);
表5 DBE_XMLPARSER.PARSEBUFFER接口参数说明 参数
描述
p
指定的parser类型对象。
doc
存储XML文档的字符串。
- PARSEBUFFER函数能够解析的字符串最大长度为32767,超过最大长度解析报错。
- 与ORA数据库差异:字符串encoding只支持UTF-8;version字段只支持1.0,1.0-1.9解析警告但正常执行,1.9以上报错。
- 与ORA数据库DTD校验差异:
- !ATTLIST to type (CHECK|check|Check) "Ch..."将报错,因默认值"Ch..."不属于括号中枚举值,而ORA数据库不报错。
- <!ENTITY baidu "www.baidu.com">...... &Baidu;&writer将报错,因区分字母大小写,Baidu无法与baidu对应,而ORA数据库不报错。
- 与ORA数据库命名空间校验差异:解析未声明的命名空间标签正常执行,而ORA数据库会报错。
- 与ORA数据库xml预定义实体解析差异:'"会被解析转义为字符,而ORA数据库中预定义实体统一都没有转义为字符。
示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
-- 新建parser,PARSEBUFFER解析字符串,获取文档打印出来。 DECLARE l_parser dbe_xmlparser.parser; l_doc dbe_xmldom.domdocument; buffer varchar2 := '<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Donot forget me this weekend!</body> </note>'; buffer2 varchar2; BEGIN l_parser := dbe_xmlparser.newparser(); dbe_xmlparser.PARSEBUFFER(l_parser, buffer); l_doc := dbe_xmlparser.getdocument(l_parser); dbe_xmldom.writetobuffer(l_doc, buffer2); RAISE NOTICE '%', buffer2; dbe_xmlparser.freeparser(l_parser); dbe_xmldom.freedocument(l_doc); END; /
执行结果:
1 2 3 4 5 6 7
NOTICE: <?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Donot forget me this weekend!</body> </note>
- DBE_XMLPARSER.PARSECLOB
DBE_XMLPARSER.PARSECLOB的存储过程原型为:
1 2 3
DBE_XMLPARSER.PARSECLOB ( p IN parser, doc IN CLOB);
表6 DBE_XMLPARSER.PARSECLOB接口参数说明 参数
描述
p
指定的parser类型对象。
doc
存储XML文档的clob字符串。
- PARSECLOB不支持解析大于1GB的clob。
- 与ORA数据库差异:字符串encoding只支持UTF-8;version字段只支持1.0,1.0-1.9解析警告但正常执行,1.9以上报错。
- 与ORA数据库DTD校验差异:
- !ATTLIST to type (CHECK|check|Check) "Ch..."将报错,因默认值"Ch..."不属于括号中枚举值,而ORA数据库不报错。
- <!ENTITY baidu "www.baidu.com">...... &Baidu;&writer将报错,因区分字母大小写,Baidu无法与baidu对应,而ORA数据库不报错。
- 与ORA数据库命名空间校验差异:解析未声明的命名空间标签正常执行,而ORA数据库会报错。
- 与ORA数据库xml预定义实体解析差异:'"会被解析转义为字符,而ORA数据库中预定义实体统一都没有转义为字符。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
-- 新建parser,parseclob解析字符串,获取文档打印出来。 DECLARE l_clob clob := '<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>this weekend!</body> </note>'; -- Create a parser. l_parser dbe_xmlparser.parser; l_doc dbe_xmldom.domdocument; buffer varchar2(1000); BEGIN l_parser := dbe_xmlparser.newparser(); -- Parse the document and create a new DOM document. dbe_xmlparser.parseclob(l_parser, l_clob); l_doc := dbe_xmlparser.getdocument(l_parser); dbe_xmldom.writetobuffer(l_doc, buffer); RAISE NOTICE '%',buffer; dbe_xmlparser.freeparser(l_parser); dbe_xmldom.freedocument(l_doc); END; /
执行结果:
1 2 3 4 5 6 7
NOTICE: <?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>this weekend!</body> </note>
- DBE_XMLPARSER.SETVALIDATIONMODE
DBE_XMLPARSER.SETVALIDATIONMODE的存储过程原型为:
1 2 3
DBE_XMLPARSER.SETVALIDATIONMODE( p IN parser) yes IN BOOLEAN);
表7 DBE_XMLPARSER.SETVALIDATIONMODE接口参数说明 参数
描述
p
指定的parser类型对象
yes
要设置的模式:- TRUE:开启DTD验证。
- FALSE:不开启验证。
- SETVALIDATIONMODE函数yes传入为空,不改变parser的解析验证模式。
- parser初始化默认为开启DTD验证模式。
示例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
-- 新建parser,设置的待解析xml字符串同DTD格式不匹配。 -- setValidationMode设置为false可以正常解析,设置为true后解析报错。 DECLARE l_clob clob := '<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <table> <name attr1="WEB" attr2="web2">African Coffee Table</name> <width>80</width> <length>120</length> </table>'; l_parser dbe_xmlparser.parser; l_doc dbe_xmldom.domdocument; buffer varchar2(1000); BEGIN l_parser := dbe_xmlparser.newparser(); -- 设为 false,去解析 dbe_xmlparser.setValidationMode(l_parser, false); dbe_xmlparser.parseclob(l_parser, l_clob); l_doc := dbe_xmlparser.getdocument(l_parser); dbe_xmldom.writetobuffer(l_doc, buffer); RAISE NOTICE '%', buffer; dbe_xmlparser.freeparser(l_parser); dbe_xmldom.freedocument(l_doc); END; /
执行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13
NOTICE: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ELEMENT note (to , from , heading , body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <table> <name attr1="WEB" attr2="web2">African Coffee Table</name> <width>80</width> <length>120</length> </table>
示例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
-- 新建parser,设置的待解析xml字符串同DTD格式不匹配。 -- setValidationMode设置为true后解析报错。 DECLARE l_clob clob := '<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <table> <name attr1="WEB" attr2="web2">African Coffee Table</name> <width>80</width> <length>120</length> </table>'; l_parser dbe_xmlparser.parser; l_doc dbe_xmldom.domdocument; buffer varchar2(1000); BEGIN l_parser := dbe_xmlparser.newparser(); -- 设为 true,去解析。 --xml字符串不符合DTD格式,预期将报错 dbe_xmlparser.setValidationMode(l_parser, true); dbe_xmlparser.parseclob(l_parser, l_clob); l_doc := dbe_xmlparser.getdocument(l_parser); dbe_xmldom.writetobuffer(l_doc, buffer); dbe_xmlparser.freeparser(l_parser); dbe_xmldom.freedocument(l_doc); END; /
执行结果:
1 2
xmlparser解析报错 ERROR: invalid XML document