GaussDB-DBE_XMLPARSER

40 阅读6分钟

GaussDB-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兼容模式。

接口名称描述
DBE_XMLPARSER.FREEPARSER释放PARSER。
DBE_XMLPARSER.GETDOCUMEN...获取解析的document节点。
DBE_XMLPARSER.GETVALIDAT...获取validate属性。
DBE_XMLPARSER.NEWPARSER新建PARSER实例。
DBE_XMLPARSER.PARSEBUFFE...解析VARCHAR字符串。
DBE_XMLPARSER.PARSECLOB解析CLOB字符串。
DBE_XMLPARSER.SETVALIDAT...设置validate属性。
  • DBE_XMLPARSER.FREEPARSER

    释放给定的PARSER对象。

    DBE_XMLPARSER.FREEPARSER的存储过程原型为:

    | ``` ž DBE_XMLPARSER.FREEPARSER ( ž p IN parser);

    | ------------------------------------------------------------------- |
    
    | **参数** | **描述**         |
    | :----- | :------------- |
    | p      | 指定的parser类型对象。 |
    
    示例:
    
    | ```
    -- 新建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的函数原型为:

    | ``` DBE_XMLPARSER.GETDOCUMENT ( p IN parser) RETURN DOMDocument;

    | --------------------------------------------------------------------------------- |
    
    | **参数** | **描述**         |
    | :----- | :------------- |
    | p      | 指定的parser类型对象。 |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/1c8322c3a42d4549ac32920ffa7e1d0c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771296432&x-signature=yTYSqoMXkC6i02zIirP0Ylf28a0%3D)
    
    -   GETDOCUMENT函数无传入参数,报错。
    -   GETDOCUMENT函数参数parser传入为空,返回null。
    
    <!---->
    
    -   GETDOCUMENT函数传入的parser还没有解析文档,返回null。
    
    示例:
    
    | ```
    -- 新建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; / 
    ``` |
    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    执行结果:
    
    | ```
    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的函数原型为:

    | ``` DBE_XMLPARSER.GETVALIDATIONMODE ( p IN parser) RETURN BOOLEAN;

    | ----------------------------------------------------------------------------------- |
    
    | **参数** | **描述**         |
    | :----- | :------------- |
    | p      | 指定的parser类型对象。 |
    
    示例:
    
    | ```
    -- 新建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; / 
    ``` |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    执行结果:
    
    | ```
    NOTICE:  validation 
    ``` |
    | ---------------------------- |
    
  • DBE_XMLPARSER.NEWPARSER

    新建Parser对象,返回一个新的解析器实例。

    DBE_XMLPARSER.NEWPARSER的函数原型为:

    | ``` DBE_XMLPARSER.NEWPARSER RETURN Parser;

    | ------------------------------------------------- |
    
    示例:
    
    | ```
    -- 新建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的存储过程原型为:

    | ``` DBE_XMLPARSER.PARSEBUFFER ( p IN parser, doc IN VARCHAR2);

    | ----------------------------------------------------------------------------------- |
    
    | **参数** | **描述**         |
    | :----- | :------------- |
    | p      | 指定的parser类型对象。 |
    | doc    | 存储XML文档的字符串。   |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/61e2b16a0d884854b254e446f8080e46~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771296432&x-signature=miKxOhACaL%2FOvuLUwUwFE34bN9Y%3D)
    
    -   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预定义实体解析差异:&apos;&quot;会被解析转译为“字符”,而ORA数据库中预定义实体统一都没有转译为字符。
    
    示例:
    
    | ```
    -- 新建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; / 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    执行结果:
    
    | ```
    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的存储过程原型为:

    | ``` DBE_XMLPARSER.PARSECLOB ( p IN parser, doc IN CLOB);

    | ----------------------------------------------------------------------------- |
    
    | **参数** | **描述**           |
    | :----- | :--------------- |
    | p      | 指定的parser类型对象。   |
    | doc    | 存储XML文档的clob字符串。 |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/4bd1bddeb0f54e4a93b5290bbe9e7d09~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771296432&x-signature=bf7TVSjV9EJILNMNfKb2DlmdcE4%3D)
    
    -   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预定义实体解析差异:&apos;&quot;会被解析转译为“字符”,而ORA数据库中预定义实体统一都没有转译为字符。
    
    示例:
    
    | ```
    -- 新建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;   / 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
    
    执行结果:
    
    | ```
    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的存储过程原型为:

    | ``` DBE_XMLPARSER.SETVALIDATIONMODE( p IN parser) yes IN BOOLEAN);

    | -------------------------------------------------------------------------------------- |
    
    | **参数** | **描述**                                    |
    | :----- | :---------------------------------------- |
    | p      | 指定的parser类型对象                             |
    | yes    | 要设置的模式:-   TRUE:开启DTD验证。
    -   FALSE:不开启验证。 |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/13f1cb1f5e3e457f9ca5a436ba2bcb60~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771296432&x-signature=1WcKMKpQGSyt2vUvR48DLbCZkaE%3D)
    
    -   SETVALIDATIONMODE函数yes传入为空,不改变parser的解析验证模式。
    -   parser初始化默认为开启DTD验证模式。
    
    示例1:
    
    | ```
    -- 新建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;   / 
    ``` |
    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    执行结果:
    
    | ```
    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:
    
    | ```
    -- 新建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;   / 
    ``` |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    执行结果:
    
    | ```
    xmlparser解析报错 ERROR:  invalid XML document 
    ``` |
    | --------------------------------------------------- |
    

更多详情请参考GaussDB 文档中心:doc.hcs.huawei.com/db/zh-cn/ga…