更新时间:2024-08-20 GMT+08:00

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高级包只支持A兼容模式。

表1 DBE_XMLPARSER接口参数说明

接口名称

描述

DBE_XMLPARSER.FREEPARSER

释放PARSER。

DBE_XMLPARSER.GETDOCUMENT

获取解析的document节点。

DBE_XMLPARSER.GETVALIDATIONMODE

获取validate属性。

DBE_XMLPARSER.NEWPARSER

新建PARSER实例。

DBE_XMLPARSER.PARSEBUFFER

解析VARCHAR字符串。

DBE_XMLPARSER.PARSECLOB

解析CLOB字符串。

DBE_XMLPARSER.SETVALIDATIONMODE

设置validate属性。

  • DBE_XMLPARSER.FREEPARSER

    释放给定的PARSER对象。

    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
    
  • DBE_XMLPARSER.NEWPARSER

    新建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

    PARSEBFER解析存储在字符串中的XML文档。

    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,超过最大长度解析报错。
    • 与A数据库差异:字符串encoding只支持UTF-8;version字段只支持1.0,1.0-1.9解析警告但正常执行,1.9以上报错。
    • 与A数据库DTD校验差异:
      • !ATTLIST to type (CHECK|check|Check) "Ch..."将报错,因默认值"Ch..."不属于括号中枚举值,而A数据库不报错。
      • <!ENTITY baidu "www.baidu.com">...... &Baidu;&writer将报错,因区分字母大小写,Baidu无法与baidu对应,而A数据库不报错。
    • 与A数据库命名空间校验差异:解析未声明的命名空间标签正常执行,而A数据库会报错。
    • 与A数据库xml预定义实体解析差异:&apos;&quot;会被解析转义为字符’”,而A数据库中预定义实体统一都没有转义为字符。
    示例:
     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

    PARSECLOB解析存储在Clob中的XML文档。

    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不支持解析大于等于2GB的clob。
    • 与A数据库差异:字符串encoding只支持UTF-8;version字段只支持1.0,1.0-1.9解析警告但正常执行,1.9以上报错。
    • 与A数据库DTD校验差异:
      • !ATTLIST to type (CHECK|check|Check) "Ch..."将报错,因默认值"Ch..."不属于括号中枚举值,而A数据库不报错。
      • <!ENTITY baidu "www.baidu.com">...... &Baidu;&writer将报错,因区分字母大小写,Baidu无法与baidu对应,而A数据库不报错。
    • 与A数据库命名空间校验差异:解析未声明的命名空间标签正常执行,而A数据库会报错。
    • 与A数据库xml预定义实体解析差异:&apos;&quot;会被解析转义为字符’”,而A数据库中预定义实体统一都没有转义为字符。
    示例:
     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

    设置给定Parser的解析验证模式。

    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