From e14d7f1c00df611d18fd0b91ed4eb90a8d967c43 Mon Sep 17 00:00:00 2001 From: blig Date: Mon, 28 Oct 2024 19:30:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B7=BB=E5=8A=A0gms=5Fxmldo?= =?UTF-8?q?m=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../expected/plpython_check_writetofile.out | 61 ++ .../expected/plpython_gms_xmldom2.out | 801 ++++++++++++++++++ src/common/pl/plpython/plpython3u--1.0.sql | 710 ++++++++++++++++ .../sql/plpython_check_writetofile.sql | 35 + .../pl/plpython/sql/plpython_gms_xmldom2.sql | 646 ++++++++++++++ 5 files changed, 2253 insertions(+) create mode 100644 src/common/pl/plpython/expected/plpython_check_writetofile.out create mode 100644 src/common/pl/plpython/expected/plpython_gms_xmldom2.out create mode 100644 src/common/pl/plpython/sql/plpython_check_writetofile.sql create mode 100644 src/common/pl/plpython/sql/plpython_gms_xmldom2.sql diff --git a/src/common/pl/plpython/expected/plpython_check_writetofile.out b/src/common/pl/plpython/expected/plpython_check_writetofile.out new file mode 100644 index 0000000000..876e420167 --- /dev/null +++ b/src/common/pl/plpython/expected/plpython_check_writetofile.out @@ -0,0 +1,61 @@ +\! cat /tmp/attribute_xmldom.xml +111\! rm /tmp/attribute_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/cdatasection_xmldom.xml +\! rm /tmp/cdatasection_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/comment_xmldom.xml + +\! rm /tmp/comment_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/document_frag_xmldom.xml + + + testtext1 + testtext2 + +\! rm /tmp/document_frag_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/document_type_xmldom.xml +]> +\! rm /tmp/document_type_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/document_xmldom.xml + +]> + + + Arwen + 123 + + + tom + 456 + + +\! rm /tmp/document_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/document2_xmldom.xml + +]> + + + Arwen + 123 + + + tom + 456 + + +\! rm /tmp/document2_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/element_xmldom.xml + + Arwen + 123 + +\! rm /tmp/element_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/entity_xmldom.xml +\! rm /tmp/entity_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/notation_xmldom.xml +\! rm /tmp/notation_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/processinstruncation_xmldom.xml + +\! rm /tmp/processinstruncation_xmldom.xml -rf > /dev/null 2>&1 +\! cat /tmp/text_xmldom.xml +DataTag +\! rm /tmp/text_xmldom.xml -rf > /dev/null 2>&1 diff --git a/src/common/pl/plpython/expected/plpython_gms_xmldom2.out b/src/common/pl/plpython/expected/plpython_gms_xmldom2.out new file mode 100644 index 0000000000..176ed86038 --- /dev/null +++ b/src/common/pl/plpython/expected/plpython_gms_xmldom2.out @@ -0,0 +1,801 @@ +-- test for DOMCharacterData +-- include 5 functions: appenddata, setdata, insertdata, replacedata and deletedata +declare + v_clob clob; + v_doc gms_xmldom.domdocument; + v_nodelist gms_xmldom.domnodelist; + v_node1 gms_xmldom.domnode; + v_chardata1 gms_xmldom.DOMCharacterData; + v_char1 varchar2(100); +begin + v_clob:=' + + + xmldom test + DOMCharacterData + origin data + + '; + + v_doc := gms_xmldom.newdomdocument(v_clob); + v_nodelist := gms_xmldom.getelementsbytagname(v_doc, 'persons'); + v_node1 := gms_xmldom.getfirstchild(gms_xmldom.item(v_nodelist, 0)); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + v_chardata1 := gms_xmldom.makeCharacterData(v_node1); + raise notice '%', (gms_XMLDOM.GETLENGTH(v_chardata1)); + gms_xmldom.setdata(v_chardata1, 'laoliu'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.insertdata(v_chardata1, 3, 'XXX'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.insertdata(v_chardata1, 9, 'wude'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.replacedata(v_chardata1, 13, 5, 'YYYY'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.replacedata(v_chardata1, 6, 3, 'ZZZZ'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.replacedata(v_chardata1, 18, 0, 'YYYY'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.replacedata(v_chardata1, 6, 0, 'AAAA'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.deletedata(v_chardata1, 26, 3); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.deletedata(v_chardata1, 9, 3); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.deletedata(v_chardata1, 9, 0); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.appenddata(v_chardata1, '_tail'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); +end; +/ +NOTICE: origin data +NOTICE: 11 +NOTICE: laoliu +NOTICE: laoXXXliu +NOTICE: laoXXXliuwude +NOTICE: laoXXXliuwudeYYYY +NOTICE: laoXXXZZZZwudeYYYY +NOTICE: laoXXXZZZZwudeYYYYYYYY +NOTICE: laoXXXAAAAZZZZwudeYYYYYYYY +NOTICE: laoXXXAAAAZZZZwudeYYYYYYYY +NOTICE: laoXXXAAAZZwudeYYYYYYYY +NOTICE: laoXXXAAAZZwudeYYYYYYYY +NOTICE: laoXXXAAAZZwudeYYYYYYYY_tail +--gms_xmldom.DOMEntityReference +--declare +-- v_clob clob; +-- v_doc gms_xmldom.domdocument; +-- v_node1 gms_xmldom.domnode; +-- v_enti_re gms_xmldom.DOMEntityReference; +-- v_char1 varchar2(100); +--begin +-- v_clob:=' +-- +-- +-- xmldom test +-- DOMCharacterData +-- origin data +-- +-- '; +-- +-- v_doc := gms_xmldom.newdomdocument(v_clob); +-- v_enti_re := gms_xmldom.createentityreference(v_doc, 'my_entiref'); +-- raise notice '%', (v_char1); +--end; +--/ +-- test notation and entity +-- include 8 functions: findnotation, getnotations, makeentity, makenotation and getnotationname +-- getdoctype, getentities, makeDocumentType +declare + v_clob clob; + v_doc gms_xmldom.domdocument; + v_node1 gms_xmldom.domnode; + v_node gms_xmldom.domnode; + v_entity gms_xmldom.DOMENTITY; + v_notatioin gms_xmldom.DOMNOTATION; + v_doctype gms_xmldom.DOMDOCUMENTTYPE; + v_map gms_xmldom.DOMNamedNodeMap; + v_char1 varchar2(100); +begin + v_clob:=' + + + + + + + + + +]> + + + Arwen + 123 + + + tom + 456 + +'; + + v_doc := gms_xmldom.newdomdocument(v_clob); + v_doctype := gms_xmldom.getdoctype(v_doc); + v_notatioin := gms_xmldom.findnotation(v_doctype, 'PNG'); + v_char1 := gms_xmldom.getNodeName(gms_xmldom.MAKENODE(v_notatioin)); + raise notice 'notataion name: %', (v_char1); + + v_map := gms_xmldom.getnotations(v_doctype); + raise notice 'notationi map length: %', (gms_XMLDOM.GETLENGTH(v_map)); + + v_node1 := gms_xmldom.item(v_map, 0); + v_notatioin := gms_xmldom.makenotation(v_node1); + v_char1 := gms_xmldom.getNodeName(gms_xmldom.MAKENODE(v_notatioin)); + raise notice 'notataion name: %', (v_char1); + + v_map := gms_xmldom.getentities(v_doctype); + raise notice 'entity map length: %', (gms_XMLDOM.GETLENGTH(v_map)); + + v_node1 := gms_xmldom.item(v_map, 2); + v_entity := gms_xmldom.makeentity(v_node1); + v_char1 := gms_xmldom.getnotationname(v_entity); + raise notice 'entity notation name: %', (v_char1); + + v_node := gms_XMLDOM.makenode(v_doctype); + v_doctype := gms_xmldom.makeDocumentType(v_node); +end; +/ +NOTICE: notataion name: PNG +NOTICE: notationi map length: 1 +NOTICE: notataion name: PNG +NOTICE: entity map length: 3 +NOTICE: entity notation name: PNG +-- test setdoctype +-- include 1 functions: setdoctype +declare + v_clob clob; + v_doc gms_xmldom.domdocument; + v_doctype gms_xmldom.DOMDOCUMENTTYPE; + v_char1 varchar2(1000); +begin + v_clob := ' + + + Arwen + 123 + +'; + + v_doc := gms_xmldom.newdomdocument(v_clob); + + gms_xmldom.SETDOCTYPE(v_doc, 'staff', 'http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd', '-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN'); + v_char1 := gms_xmldom.writetobuffer(v_doc, v_char1); + --输出修改后的clob内容 + raise notice '%', ('文档为:' || v_char1); + + v_doctype := gms_xmldom.getdoctype(v_doc); + v_char1 := gms_xmldom.writetobuffer(gms_xmldom.makenode(v_doctype), v_char1); + raise notice '%', ('DTD为:' || v_char1); +end; +/ +NOTICE: 文档为: + + + + Arwen + 123 + + + +NOTICE: DTD为: + +-- test for docfragment +-- include 8 functions: normalize, writetofile(4), freeelement, freedocfrag and makedocumentfragment +DECLARE + v_clob clob; + doc gms_XMLDOM.DOMDocument; + docelement gms_xmldom.DOMElement; + docelemnode gms_XMLDOM.DOMNode; + docfragment gms_XMLDOM.DOMDocumentFragment; + docfragmentnode gms_XMLDOM.DOMnode; + createelem gms_XMLDOM.DOMElement; + elemnode gms_XMLDOM.DOMNode; + text gms_XMLDOM.DOMText; + textnode gms_XMLDOM.DOMNode; + resNode gms_XMLDOM.DOMNode; + buf varchar2(4000); +BEGIN + v_clob := ' + +'; + + --返回新的document实例 + doc := gms_XMLDOM.newDOMDocument(v_clob); + + docfragment := gms_XMLDOM.createDocumentFragment(doc); + docfragmentnode := gms_XMLDOM.makeNode(docfragment); + docfragment := gms_xmldom.makedocumentfragment(docfragmentnode); + + --在文档片段添加内容 + --创建DOMElement对象 + createelem := gms_XMLDOM.createElement(doc, 'test'); + elemnode := gms_XMLDOM.makeNode(createelem); + + --创建内容 + text := gms_XMLDOM.createTextnode(doc, 'testtext1'); + textnode := gms_XMLDOM.makeNode(text); + + --添加到指定位置 + resNode := gms_XMLDOM.appendChild(elemnode, textnode); + text := gms_XMLDOM.createTextnode(doc, 'testtext2'); + textnode := gms_XMLDOM.makeNode(text); + resNode := gms_XMLDOM.appendChild(elemnode, textnode); + resNode := gms_XMLDOM.appendChild(docfragmentnode, elemnode); + + --将片段加入到文档 + docelement := gms_xmldom.getDocumentElement(doc); + docelemnode := gms_XMLDOM.makeNode(docelement); + resNode := gms_XMLDOM.appendChild(docelemnode, docfragmentnode); + + buf := gms_xmldom.writetobuffer(doc, buf); + --输出修改后的clob内容 + raise notice '%', ('文档为:' || buf); + + buf := gms_xmldom.writetobuffer(docelemnode, buf); + --输出修改后的clob内容 + raise notice '%', ('normalize前的文档片段为:' || buf); + + --normalize element + gms_xmldom.normalize(createelem); + + buf := gms_xmldom.writetobuffer(docelemnode, buf); + --输出修改后的clob内容 + raise notice '%', ('normalize后的文档片段为:' || buf); + + --释放 + gms_xmldom.freeelement(createelem); + gms_xmldom.freeelement(docelement); + gms_xmldom.freedocfrag(docfragment); +END; +/ +NOTICE: 文档为: + + + testtext1 + testtext2 + + + +NOTICE: normalize前的文档片段为: + + testtext1 + testtext2 + + + +NOTICE: normalize后的文档片段为: + testtext1testtext2 + + +-- test for attribute remove and setvalue +-- include 8 functions: setcharset, setstandalone, removenameditem, removenameditem-ns, removeattribute, +-- removeattribute-ns, makeattr, attr-setvalue +DECLARE + var clob; + doc gms_XMLDOM.DOMDocument; + docNode gms_XMLDOM.DOMNode; + node gms_XMLDOM.DOMNode; + docelem gms_XMLDOM.DOMElement; + attrelem gms_XMLDOM.DOMElement; + nodelist gms_XMLDOM.DOMNodelist; + attrmap gms_XMLDOM.DOMNamedNodeMap; + length integer; + isNull boolean; + attr gms_xmldom.DOMAttr; + attrnode gms_XMLDOM.DOMNode; + doctype gms_xmldom.DOMDocumentType; + buf varchar2(4000); +BEGIN + var := ' + + + learning math + 张三 + 561 + +'; + --返回新的document实例 + doc := gms_xmldom.newDOMDocument(var); + + --设置字符集, DTD, standalone属性 + gms_xmldom.setcharset(doc, 'UTF-16'); + gms_xmldom.setstandalone(doc, 'true'); + buf := gms_xmldom.writetobuffer(doc, buf); + --输出修改后的clob内容 + raise notice '%', ('文档为:' || buf); + + docNode := gms_xmldom.makeNode(doc); + docelem := gms_xmldom.getDocumentElement(doc); + nodelist := gms_xmldom.getElementsByTagName(docelem, 'book'); + node := gms_xmldom.item(nodelist, 0); + --获取第一个EMP节点的属性 + attrmap := gms_xmldom.getAttributes(node); + isNull := gms_xmldom.isNull(attrmap); + raise notice '%', ('isNull(DOMNamedNodeMap):' || case when isNull then 'Y' else 'N' end); + + --查看map的长度验证结果 + length := gms_xmldom.getlength(attrmap); + raise notice '%', ('第一个book节点的属性长度为:' || length ); + + --删除一个属性 + docNode := gms_xmldom.removenameditem(attrmap, 'year'); + buf := gms_xmldom.writetobuffer(node, buf); + --输出修改后的clob内容 + raise notice '%', ('属性为:' || buf); + + --删除另一个属性 + attrelem := gms_xmldom.makeElement(node); + gms_xmldom.removeattribute(attrelem, 'lang'); + buf := gms_xmldom.writetobuffer(node, buf); + --输出修改后的clob内容 + raise notice '%', ('属性为:' || buf); + + --删除带namespace的属性 + docNode := gms_xmldom.removenameditem(attrmap, 'year', 'http://example.com/ns'); + buf := gms_xmldom.writetobuffer(node, buf); + --输出修改后的clob内容 + raise notice '%', ('属性为:' || buf); + + --删除另一个带namespace的属性 + gms_xmldom.removeattribute(attrelem, 'lang', 'http://example.com/ns'); + buf := gms_xmldom.writetobuffer(node, buf); + --输出修改后的clob内容 + raise notice '%', ('属性为:' || buf); + + --修改属性值 + attrnode := gms_xmldom.item(attrmap, 0); + attr := gms_xmldom.makeattr(attrnode); + gms_xmldom.setvalue(attr, 'yuwen'); + buf := gms_xmldom.writetobuffer(node, buf); + raise notice '%', ('属性值为:' || buf); + + --修改属性的namespace值 + gms_xmldom.setPrefix(attrnode, 'nns'); + buf := gms_xmldom.writetobuffer(node, buf); + raise notice '%', ('属性值为:' || buf); +END; +/ +NOTICE: 文档为: + + + learning math + 张三 + 561 + + + +NOTICE: isNull(DOMNamedNodeMap):N +NOTICE: 第一个book节点的属性长度为:5 +NOTICE: 属性为: + learning math + 张三 + 561 + + +NOTICE: 属性为: + learning math + 张三 + 561 + + +NOTICE: 属性为: + learning math + 张三 + 561 + + +NOTICE: 属性为: + learning math + 张三 + 561 + + +NOTICE: 属性值为: + learning math + 张三 + 561 + + +NOTICE: 属性值为: + learning math + 张三 + 561 + + +-- test for make funcation +-- include 6 functions: makeprocessinginstruction, maketext, makecomment, makecdatasection +-- setdata, setPrefix +DECLARE + var clob; + doc gms_XMLDOM.DOMDocument; + docNode gms_XMLDOM.DOMNode; + piinode gms_XMLDOM.DOMNode; + resnode gms_XMLDOM.DOMNode; + booknode gms_XMLDOM.DOMNode; + booklistnode gms_XMLDOM.DOMNode; + tmpnode gms_XMLDOM.DOMNode; + pii gms_XMLDOM.DOMPROCESSINGINSTRUCTION; + buf varchar2(4000); + docelem gms_XMLDOM.DOMElement; + item_elmt gms_XMLDOM.DOMElement; + item_text gms_XMLDOM.DOMTEXT; + nodelist gms_XMLDOM.DOMNodelist; + comm gms_XMLDOM.domcomment; + cdata gms_XMLDOM.DOMCDATASECTION; +BEGIN + var := ' + + + learning math + 张三 + +'; + --返回新的document实例 + doc := gms_xmldom.newDOMDocument(var); + --根节点 + docNode := gms_xmldom.MAKENODE(doc); + docelem := gms_xmldom.getDocumentElement(doc); + nodelist := gms_xmldom.getElementsByTagName(docelem, 'book'); + booknode := gms_xmldom.item(nodelist, 0); + booklistnode := gms_xmldom.getFirstChild(docNode); + + pii := gms_xmldom.CREATEPROCESSINGINSTRUCTION(doc, 'xml-stylesheet', 'type="text/xsl" href="stylesheet.xsl"'); + piinode := gms_xmldom.MAKENODE(pii); + gms_xmldom.setPrefix(piinode, 'xss'); + resnode := gms_xmldom.insertBefore(docNode, piinode, booklistnode); + + buf := gms_xmldom.writetobuffer(resnode, buf); + --输出内容 + raise notice '%', ('ProcessInstrunction为:' || buf); + + -- setdata + gms_xmldom.SETDATA(pii, 'pii first test'); + buf := gms_xmldom.writetobuffer(resnode, buf); + --输出内容 + raise notice '%', ('ProcessInstrunction setdata 后为:' || buf); + + pii := gms_xmldom.makeprocessinginstruction(resnode); + -- setdata again + gms_xmldom.SETDATA(pii, 'pii 2nd test'); + buf := gms_xmldom.writetobuffer(resnode, buf); + --输出内容 + raise notice '%', ('ProcessInstrunction setdata 后为:' || buf); + + -- maketext test + item_elmt := gms_xmldom.CREATEELEMENT(doc, 'eno'); + resnode := gms_xmldom.APPENDCHILD(booknode, gms_xmldom.MAKENODE(item_elmt)); + item_text := gms_xmldom.CREATETEXTNODE(doc, '123'); + tmpnode := gms_xmldom.APPENDCHILD(resnode, gms_xmldom.MAKENODE(item_text)); + + item_text := gms_xmldom.maketext(tmpnode); + buf := gms_xmldom.writetobuffer(resnode, buf); + --输出内容 + raise notice '%', ('element元素为:' || buf); + + -- make comment + comm := gms_xmldom.createComment(doc, 'This is a comment test'); + resnode := gms_xmldom.insertBefore(docNode, gms_xmldom.MAKENODE(comm), booklistnode); + comm := gms_xmldom.makecomment(resnode); + + -- make cdatasection + cdata := gms_xmldom.createCDATASection(doc, 'cdatasection example'); + resnode := gms_xmldom.APPENDCHILD(booknode, gms_xmldom.MAKENODE(cdata)); + cdata := gms_xmldom.makecdatasection(resnode); + buf := gms_xmldom.writetobuffer(gms_xmldom.MAKENODE(cdata), buf); + --输出内容 + raise notice '%', ('cdatasection为:' || buf); + + --输出文档内容 + buf := gms_xmldom.writetobuffer(docNode, buf); + raise notice '%', ('文档内容为:' || buf); +END; +/ +NOTICE: ProcessInstrunction为: + +NOTICE: ProcessInstrunction setdata 后为: + +NOTICE: ProcessInstrunction setdata 后为: + +NOTICE: element元素为:123 + +NOTICE: cdatasection为: +NOTICE: 文档内容为: + + + + + learning math + 张三 + 123 + + + +--test for setnodevalue +--include 1 functions: setnodevalue +DECLARE + var clob; + doc gms_xmldom.DOMDocument; + node gms_xmldom.DOMNode; + docelem gms_xmldom.DOMElement; + nodelist gms_xmldom.DOMNodelist; + attrmap gms_xmldom.DOMNamedNodeMap; + attr gms_xmldom.DOMAttr; + attrnode gms_xmldom.DOMNode; + doctype gms_xmldom.DOMDocumentType; + data_elmt gms_xmldom.DOMtext; + cdata gms_xmldom.DOMCDATASECTION; + entref gms_xmldom.DOMENTITYREFERENCE; + enti gms_xmldom.DOMENTITY; + v_map gms_xmldom.DOMNamedNodeMap; + v_node gms_xmldom.DOMNode; + comm gms_xmldom.DOMComment; + docfragment gms_xmldom.DOMDocumentFragment; + pii gms_xmldom.DOMPROCESSINGINSTRUCTION; + buf varchar2(4000); +BEGIN + var := ' + + + + + + + + + + +]> + + + Arwen + 123 + + + tom + 456 + +'; + --返回新的document实例 + doc := gms_xmldom.newDOMDocument(var); + + docelem := gms_xmldom.getDocumentElement(doc); + nodelist := gms_xmldom.getElementsByTagName(docelem, 'member'); + node := gms_xmldom.item(nodelist, 0); + buf := gms_xmldom.writetobuffer(node, buf); + raise notice '%', (buf); + + --属性节点setnodevalue + attrmap := gms_xmldom.getAttributes(node); + attrnode := gms_xmldom.item(attrmap, 0); + buf := gms_xmldom.getnodevalue(attrnode); + raise notice '%', (buf); + gms_xmldom.setnodevalue(attrnode, 'xxxxx'); + buf := gms_xmldom.getnodevalue(attrnode); + raise notice '%', (buf); + + --text节点setnodevalue + data_elmt := gms_xmldom.createtextnode(doc, 'DataTag'); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(data_elmt)); + raise notice '%', (buf); + gms_xmldom.setnodevalue(gms_xmldom.makenode(data_elmt), 'xxxxx'); + buf := gms_xmldom.writetobuffer(gms_xmldom.makenode(data_elmt), buf); + raise notice '%', (buf); + + --CDATA_SECTION节点setnodevalue + cdata := gms_xmldom.createCDATASection(doc, 'cdatasection example'); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(cdata)); + raise notice '%', (buf); + gms_xmldom.setnodevalue(gms_xmldom.makenode(cdata), 'xxxxx'); + buf := gms_xmldom.writetobuffer(gms_xmldom.makenode(cdata), buf); + raise notice '%', (buf); + + --实体setnodevalue + doctype := gms_xmldom.getdoctype(doc); + v_map := gms_xmldom.getentities(doctype); + v_node := gms_xmldom.item(v_map, 1); + buf := gms_xmldom.getnodevalue(v_node); + raise notice '%', (buf); + + --notation setnodevalue + v_map := gms_xmldom.getnotations(doctype); + v_node := gms_xmldom.item(v_map, 0); + buf := gms_xmldom.getnodevalue(v_node); + raise notice '%', (buf); + + --comment setnodevalue + comm := gms_xmldom.createcomment(doc, 'this is a comment'); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(comm)); + raise notice '%', (buf); + gms_xmldom.setnodevalue(gms_xmldom.makenode(comm), 'xxxxx'); + buf := gms_xmldom.writetobuffer(gms_xmldom.makenode(comm), buf); + raise notice '%', (buf); + + --documentfragment setnodevalue + docfragment := gms_xmldom.createDocumentFragment(doc); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(docfragment)); + raise notice '%', (buf); + + --processing instruction + pii := gms_xmldom.CREATEPROCESSINGINSTRUCTION(doc, 'xml-stylesheet', 'type="text/xsl" href="stylesheet.xsl"'); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(pii)); + raise notice '%', (buf); + gms_xmldom.setnodevalue(gms_xmldom.makenode(pii), 'xxxxx'); + buf := gms_xmldom.writetobuffer(gms_xmldom.makenode(pii), buf); + raise notice '%', (buf); +END; +/ +NOTICE: + Arwen + 123 + + +NOTICE: 111 +NOTICE: xxxxx +NOTICE: DataTag +NOTICE: xxxxx + +NOTICE: cdatasection example +NOTICE: +NOTICE: +NOTICE: +NOTICE: this is a comment +NOTICE: + +NOTICE: +NOTICE: type="text/xsl" href="stylesheet.xsl" +NOTICE: + +--test for writetofile +--include 4 functions: writetofile +declare + v_clob clob; + v_doc gms_xmldom.domdocument; + v_node1 gms_xmldom.domnode; + v_entity gms_xmldom.DOMENTITY; + v_notatioin gms_xmldom.DOMNOTATION; + v_doctype gms_xmldom.DOMDOCUMENTTYPE; + v_map gms_xmldom.DOMNamedNodeMap; + elemnode gms_XMLDOM.DOMNode; + attrnode gms_XMLDOM.DOMNode; + docelem gms_XMLDOM.DOMElement; + attrelem gms_XMLDOM.DOMElement; + nodelist gms_XMLDOM.DOMNodelist; + attrmap gms_XMLDOM.DOMNamedNodeMap; + data_elmt gms_XMLDOM.DOMtext; + cdata gms_XMLDOM.DOMCDATASECTION; + pii gms_XMLDOM.DOMPROCESSINGINSTRUCTION; + comm gms_XMLDOM.DOMComment; + docfragment gms_XMLDOM.DOMDocumentFragment; + resNode gms_XMLDOM.DOMNode; + textnode gms_XMLDOM.DOMNode; + createelem gms_XMLDOM.DOMElement; + v_char1 varchar2(100); +begin + v_clob:=' + + + + + + + + + + +]> + + + Arwen + 123 + + + tom + 456 + +'; + + v_doc := gms_xmldom.newdomdocument(v_clob); + + v_doctype := gms_xmldom.getdoctype(v_doc); + v_notatioin := gms_xmldom.findnotation(v_doctype, 'PNG'); + + --notation + gms_xmldom.writetofile(gms_XMLDOM.makenode(v_notatioin), '/tmp/notation_xmldom.xml', 'UTF-8'); + + v_map := gms_xmldom.getentities(v_doctype); + --实体写文件 + v_node1 := gms_xmldom.item(v_map, 2); + gms_xmldom.writetofile(v_node1, '/tmp/entity_xmldom.xml', 'UTF-8'); + + --元素节点写文件 + docelem := gms_xmldom.getDocumentElement(v_doc); + nodelist := gms_xmldom.getElementsByTagName(docelem, 'member'); + elemnode := gms_xmldom.item(nodelist, 0); + gms_xmldom.writetofile(elemnode, '/tmp/element_xmldom.xml', 'UTF-8'); + + --属性节点写文件 + attrmap := gms_xmldom.getAttributes(elemnode); + attrnode := gms_xmldom.item(attrmap, 0); + gms_xmldom.writetofile(attrnode, '/tmp/attribute_xmldom.xml', 'UTF-8'); + + --text节点 + data_elmt := gms_xmldom.createtextnode(v_doc, 'DataTag'); + v_node1 := gms_XMLDOM.makenode(data_elmt); + gms_xmldom.writetofile(v_node1, '/tmp/text_xmldom.xml', 'UTF-8'); + + --cdatasection + cdata := gms_XMLDOM.createCDATASection(v_doc, 'cdatasection example'); + v_node1 := gms_XMLDOM.makenode(cdata); + gms_xmldom.writetofile(v_node1, '/tmp/cdatasection_xmldom.xml', 'UTF-8'); + + --processinstruncation + pii := gms_XMLDOM.CREATEPROCESSINGINSTRUCTION(v_doc, 'xml-stylesheet', 'type="text/xsl" href="stylesheet.xsl"'); + v_node1 := gms_XMLDOM.makenode(pii); + gms_xmldom.writetofile(v_node1, '/tmp/processinstruncation_xmldom.xml', 'UTF-8'); + + --comment + comm := gms_XMLDOM.createcomment(v_doc, 'this is a comment'); + v_node1 := gms_XMLDOM.makenode(comm); + gms_xmldom.writetofile(v_node1, '/tmp/comment_xmldom.xml', 'UTF-8'); + + --DTD + gms_xmldom.writetofile(gms_XMLDOM.makenode(v_doctype), '/tmp/document_type_xmldom.xml', 'UTF-8'); + + --document fragment + docfragment := gms_XMLDOM.createDocumentFragment(v_doc); + createelem := gms_XMLDOM.createElement(v_doc, 'test'); + elemnode := gms_XMLDOM.makeNode(createelem); + + data_elmt := gms_XMLDOM.createTextnode(v_doc, 'testtext1'); + textnode := gms_XMLDOM.makeNode(data_elmt); + + resNode := gms_XMLDOM.appendChild(elemnode, textnode); + data_elmt := gms_XMLDOM.createTextnode(v_doc, 'testtext2'); + textnode := gms_XMLDOM.makeNode(data_elmt); + resNode := gms_XMLDOM.appendChild(elemnode, textnode); + resNode := gms_XMLDOM.appendChild(gms_XMLDOM.makeNode(docfragment), elemnode); + gms_xmldom.writetofile(gms_XMLDOM.makenode(docfragment), '/tmp/document_frag_xmldom.xml', 'UTF-8'); + + --document + gms_xmldom.setstandalone(v_doc, 'Yes'); + gms_xmldom.writetofile(gms_XMLDOM.makenode(v_doc), '/tmp/document_xmldom.xml', 'UTF-8'); + + gms_xmldom.writetofile(v_doc, '/tmp/document2_xmldom.xml'); +end; +/ diff --git a/src/common/pl/plpython/plpython3u--1.0.sql b/src/common/pl/plpython/plpython3u--1.0.sql index cd1fb636a0..574cfbe16f 100644 --- a/src/common/pl/plpython/plpython3u--1.0.sql +++ b/src/common/pl/plpython/plpython3u--1.0.sql @@ -9,3 +9,713 @@ CREATE PROCEDURAL LANGUAGE plpython3u; COMMENT ON PROCEDURAL LANGUAGE plpython3u IS 'PL/Python3U untrusted procedural language'; + +--gms_xmldom +create schema gms_xmldom; +GRANT USAGE ON SCHEMA gms_xmldom TO public; + +create domain gms_xmldom.DOMType as text; +create type gms_xmldom.DOMNode as (id text); +create type gms_xmldom.DOMNamedNodeMap as (id text); +create type gms_xmldom.DOMNodeList as (id text); +create type gms_xmldom.DOMAttr as (id text); +create type gms_xmldom.DOMCDataSection as (id text); +create type gms_xmldom.DOMCharacterData as (id text); +create type gms_xmldom.DOMComment as (id text); +create type gms_xmldom.DOMDocumentFragment as (id text); +create type gms_xmldom.DOMElement as (id text); +create type gms_xmldom.DOMEntity as (id text); +create type gms_xmldom.DOMNotation as (id text); +create type gms_xmldom.DOMProcessingInstruction as (id text); +create type gms_xmldom.DOMText as (id text); +create type gms_xmldom.DOMImplementation as (id text); +create type gms_xmldom.DOMDocumentType as (id text); +create type gms_xmldom.DOMDocument as (id text); + +-- begin here -------------------------- +create type gms_xmldom.DOMEntityReference as (id text); + +--gms_xmldom.appendData(DOMCharacterData, VARCHAR2) +create function gms_xmldom.appendData(cd gms_xmldom.DOMCharacterData, arg VARCHAR2) +returns void +as $$ + from xml.dom import minidom + if cd["id"] not in GD or not GD[cd["id"]]: + raise plpy.Error("DOMCharacterData is empty or invalid") + + cdNode = GD[cd["id"]] + cdNode.appendData(arg) +$$ language plpython3u package; + +--gms_xmldom.deleteData(DOMCharacterData, NUMBER, NUMBER) +create function gms_xmldom.deleteData(cd gms_xmldom.DOMCharacterData, start NUMBER, cnt NUMBER) +returns void +as $$ + from xml.dom import minidom + iStart = int(start) + iLen = int(cnt) + if cd["id"] not in GD or not GD[cd["id"]]: + raise plpy.Error("DOMCharacterData is empty or invalid") + + cdNode = GD[cd["id"]] + if cdNode._get_length() <= iStart: + return + + cdNode.deleteData(iStart, iLen) +$$ language plpython3u package; + +--gms_xmldom.insertData(DOMCharacterData, NUMBER, VARCHAR2) +create function gms_xmldom.insertData(cd gms_xmldom.DOMCharacterData, start NUMBER, arg VARCHAR2) +returns void +as $$ + from xml.dom import minidom + iStart = int(start) + if cd["id"] not in GD or not GD[cd["id"]]: + raise plpy.Error("DOMCharacterData is empty or invalid") + + cdNode = GD[cd["id"]] + if cdNode._get_length() <= iStart: + cdNode.appendData(arg) + else: + cdNode.insertData(iStart, arg) +$$ language plpython3u package; + +--gms_xmldom.replaceData(DOMCharacterData, NUMBER, NUMBER, VARCHAR2) +create function gms_xmldom.replaceData(cd gms_xmldom.DOMCharacterData, start NUMBER, cnt NUMBER, arg VARCHAR2) +returns void +as $$ + from xml.dom import minidom + iStart = int(start) + iLen = int(cnt) + if cd["id"] not in GD or not GD[cd["id"]]: + raise plpy.Error("DOMCharacterData is empty or invalid") + + cdNode = GD[cd["id"]] + if cdNode._get_length() <= iStart: + cdNode.appendData(arg) + elif iLen == 0: + cdNode.insertData(iStart, arg) + else: + cdNode.replaceData(iStart, iLen, arg) +$$ language plpython3u package; + +--gms_xmldom.setData(DOMCharacterData, VARCHAR2) +create function gms_xmldom.setData(cd gms_xmldom.DOMCharacterData, data VARCHAR2) +returns void +as $$ + from xml.dom import minidom + if cd["id"] not in GD or not GD[cd["id"]]: + raise plpy.Error("DOMCharacterData is empty or invalid") + + cdNode = GD[cd["id"]] + cdNode._set_data(data) +$$ language plpython3u package; + +--gms_xmldom.getDocType(DOMDocument) --auxiliary +create function gms_xmldom.getDocType(doc gms_xmldom.DOMDocument) +returns gms_xmldom.DOMDocumentType +as $$ + from xml.dom import minidom + if doc["id"] not in GD or not GD[doc["id"]]: + raise plpy.Error("DOMDocument is empty or invalid") + + docNode = GD[doc["id"]] + docType = docNode._get_doctype() + + resid = str(id(docType)) + if resid not in GD: + GD[resid] = docType + return [resid] +$$ language plpython3u package; + +--gms_xmldom.getEntities(DOMDocumentType) --auxiliary +create function gms_xmldom.getEntities(dt gms_xmldom.DOMDocumentType) +returns gms_xmldom.DOMNamedNodeMap +as $$ + from xml.dom import minidom + if dt["id"] not in GD or not GD[dt["id"]]: + raise plpy.Error("DOMDocumentType is empty or invalid") + + dtNode = GD[dt["id"]] + entityNode = dtNode.entities + resid = str(id(entityNode)) + if resid not in GD: + GD[resid] = entityNode + return [resid] +$$ language plpython3u package; + +--gms_xmldom.findNotation(DOMDocumentType, VARCHAR2) +create function gms_xmldom.findNotation(dt gms_xmldom.DOMDocumentType, name VARCHAR2) +returns gms_xmldom.DOMNotation +as $$ + from xml.dom import minidom + if dt["id"] not in GD or not GD[dt["id"]]: + raise plpy.Error("DOMDocumentType is empty or invalid") + + dtNode = GD[dt["id"]] + notaNode = dtNode.notations.getNamedItem(name) + if notaNode == None: + return [""] + + resid = str(id(notaNode)) + if resid not in GD: + GD[resid] = notaNode + return [resid] +$$ language plpython3u package; + +--gms_xmldom.getNotations(DOMDocumentType) +create function gms_xmldom.getNotations(dt gms_xmldom.DOMDocumentType) +returns gms_xmldom.DOMNamedNodeMap +as $$ + from xml.dom import minidom + if dt["id"] not in GD or not GD[dt["id"]]: + raise plpy.Error("DOMDocumentType is empty or invalid") + + dtNode = GD[dt["id"]] + notaNode = dtNode.notations + resid = str(id(notaNode)) + if resid not in GD: + GD[resid] = notaNode + return [resid] +$$ language plpython3u package; + +--gms_xmldom.freeDocFrag(DOMDocumentFragment) +create function gms_xmldom.freeDocFrag(df gms_xmldom.DOMDocumentFragment) +returns void +as $$ + from xml.dom import minidom + if df["id"] not in GD or not GD[df["id"]]: + return + + dfNode = GD[df["id"]] + stack = [dfNode] + while stack: + root = stack.pop() + tmpid = str(id(root)) + if tmpid in GD: + GD.pop(tmpid) + for child in root.childNodes: + stack.append(child) + dfNode.unlink() +$$ language plpython3u package; + +--gms_xmldom.freeElement(DOMElement) +create function gms_xmldom.freeElement(elem gms_xmldom.DOMElement) +returns void +as $$ + from xml.dom import minidom + if elem["id"] not in GD or not GD[elem["id"]]: + return + + elemNode = GD[elem["id"]] + stack = [elemNode] + while stack: + root = stack.pop() + tmpid = str(id(root)) + if tmpid in GD: + GD.pop(tmpid) + for child in root.childNodes: + stack.append(child) + elemNode.unlink() +$$ language plpython3u package; + +--gms_xmldom.getNotationName(DOMEntity) +create function gms_xmldom.getNotationName(ent gms_xmldom.DOMEntity) +returns VARCHAR2 +as $$ + from xml.dom import minidom + if ent["id"] not in GD or not GD[ent["id"]]: + raise plpy.Error("DOMEntity is empty or invalid") + + entNode = GD[ent["id"]] + return entNode.notationName +$$ language plpython3u package; + +--gms_xmldom.normalize(DOMElement) +create function gms_xmldom.normalize(elem gms_xmldom.DOMElement) +returns void +as $$ + from xml.dom import minidom + if elem["id"] not in GD or not GD[elem["id"]]: + raise plpy.Error("DOMElement is empty or invalid") + + elemNode = GD[elem["id"]] + elemNode.normalize() +$$ language plpython3u package; + +--gms_xmldom.internal_write_document, used internal +create function gms_xmldom.internal_write_document(doc gms_xmldom.DOMNode, filename VARCHAR2, charset VARCHAR2) +returns void +as $$ + from xml.dom import minidom + from xml.dom import Node + if doc["id"] not in GD or not GD[doc["id"]]: + raise plpy.Error("DOMNode is empty or invalid") + + docNode = GD[doc["id"]] + if docNode.nodeType != Node.DOCUMENT_NODE: + return + + if charset is None: + chset = docNode._get_encoding() + if chset is None: + encd = "UTF-8" + else: + encd = chset + else: + encd = charset + + with open(filename, 'w', encoding = encd) as writer: + docNode.writexml(writer, "", " ", "\n", encd) + + standalone = docNode._get_standalone() + if standalone is None: + return + standalone = standalone.lower() + if standalone != 'yes' and standalone != 'no': + return + + # append standalone information + file_data = "" + with open(filename, "r", encoding = encd) as f: + for line in f: + if 'xml version' in line: + if 'encoding' in line: + new_str = " standalone=\'%s\'?>" % (standalone) + else: + new_str = "standalone=\'%s\'?>" % (standalone) + line = line.replace('?>', new_str) + file_data += line + + with open(filename, "w", encoding = encd) as f: + f.write(file_data) +$$ language plpython3u package; + +--gms_xmldom.internal_write_node, used internal +create function gms_xmldom.internal_write_node(n gms_xmldom.DOMNode, filename VARCHAR2, charset VARCHAR2) +returns void +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + raise plpy.Error("DOMNode is empty or invalid") + + node = GD[n["id"]] + if node.nodeType == Node.DOCUMENT_NODE: + return + + if charset is None: + encd = "UTF-8" + else: + encd = charset + + if node.nodeType == Node.ATTRIBUTE_NODE: + with open(filename, 'w', encoding = encd) as writer: + writer.write("%s" % (node._get_value())); + return + + if node.nodeType == Node.ENTITY_NODE or node.nodeType == Node.NOTATION_NODE: + with open(filename, 'w', encoding = encd) as writer: + writer.write("<%s/>" % (node.nodeName)); + return + + if node.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + ver_enc = "\n" % (encd) + with open(filename, 'w', encoding = encd) as writer: + writer.write(ver_enc) + for nd in node.childNodes: + nd.writexml(writer, "", " ", "\n") + return + + with open(filename, 'w', encoding = encd) as writer: + node.writexml(writer, "", " ", "\n") +$$ language plpython3u package; + +--gms_xmldom.writeToFile(DOMDocument, VARCHAR2) +create function gms_xmldom.writeToFile(doc gms_xmldom.DOMDocument, filename VARCHAR2) +returns void +as $$ +declare + docNode gms_xmldom.DOMNode; +begin + docNode := gms_xmldom.makeNode(doc); + gms_xmldom.internal_write_document(docNode, filename, NULL); +end; +$$ language plpgsql package; + +--gms_xmldom.writeToFile(DOMDocument, VARCHAR2, VARCHAR2) +create function gms_xmldom.writeToFile(doc gms_xmldom.DOMDocument, filename VARCHAR2, charset VARCHAR2) +returns void +as $$ +declare + docNode gms_xmldom.DOMNode; +begin + docNode := gms_xmldom.makeNode(doc); + gms_xmldom.internal_write_document(docNode, filename, charset); +end; +$$ language plpgsql package; + +--gms_xmldom.writeToFile(DOMNode, VARCHAR2) +create function gms_xmldom.writeToFile(n gms_xmldom.DOMNode, filename VARCHAR2) +returns void +as $$ +begin + gms_xmldom.internal_write_node(n, filename, NULL); + gms_xmldom.internal_write_document(n, filename, NULL); +end; +$$ language plpgsql package; + +--gms_xmldom.writeToFile(DOMNode, VARCHAR2, VARCHAR) +create function gms_xmldom.writeToFile(n gms_xmldom.DOMNode, filename VARCHAR2, charset VARCHAR2) +returns void +as $$ +begin + gms_xmldom.internal_write_node(n, filename, charset); + gms_xmldom.internal_write_document(n, filename, charset); +end; +$$ language plpgsql package; + +--gms_xmldom.makeAttr(DOMNode) +create function gms_xmldom.makeAttr(n gms_xmldom.DOMNode) +returns gms_xmldom.DOMAttr +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + return [""] + + domNode = GD[n["id"]] + if domNode.nodeType == Node.ATTRIBUTE_NODE: + return n + + nodeNames = ('None', 'Element', 'Attribute', 'Text', 'CDATASection', 'EntityReference', 'Entity', + 'ProcessingInstruction', 'Comment', 'Document', 'DocumentType', 'DocumentFragment', 'Notation') + nodeName = nodeNames[domNode.nodeType] + raise plpy.Error("Node type %s cannot be converted to the target type" %nodeName) +$$ language plpython3u package; + +--gms_xmldom.makeCDataSection(DOMNode) +create function gms_xmldom.makeCDataSection(n gms_xmldom.DOMNode) +returns gms_xmldom.DOMCDataSection +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + return [""] + + domNode = GD[n["id"]] + if domNode.nodeType == Node.CDATA_SECTION_NODE: + return n + + nodeNames = ('None', 'Element', 'Attribute', 'Text', 'CDATASection', 'EntityReference', 'Entity', + 'ProcessingInstruction', 'Comment', 'Document', 'DocumentType', 'DocumentFragment', 'Notation') + nodeName = nodeNames[domNode.nodeType] + raise plpy.Error("Node type %s cannot be converted to the target type" %nodeName) +$$ language plpython3u package; + +--gms_xmldom.makeComment(DOMNode) +create function gms_xmldom.makeComment(n gms_xmldom.DOMNode) +returns gms_xmldom.DOMComment +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + return [""] + + domNode = GD[n["id"]] + if domNode.nodeType == Node.COMMENT_NODE: + return n + + nodeNames = ('None', 'Element', 'Attribute', 'Text', 'CDATASection', 'EntityReference', 'Entity', + 'ProcessingInstruction', 'Comment', 'Document', 'DocumentType', 'DocumentFragment', 'Notation') + nodeName = nodeNames[domNode.nodeType] + raise plpy.Error("Node type %s cannot be converted to the target type" %nodeName) +$$ language plpython3u package; + +--gms_xmldom.makeDocumentFragment(DOMNode) +create function gms_xmldom.makeDocumentFragment(n gms_xmldom.DOMNode) +returns gms_xmldom.DOMDocumentFragment +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + return [""] + + domNode = GD[n["id"]] + if domNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + return n + + nodeNames = ('None', 'Element', 'Attribute', 'Text', 'CDATASection', 'EntityReference', 'Entity', + 'ProcessingInstruction', 'Comment', 'Document', 'DocumentType', 'DocumentFragment', 'Notation') + nodeName = nodeNames[domNode.nodeType] + raise plpy.Error("Node type %s cannot be converted to the target type" %nodeName) +$$ language plpython3u package; + +--gms_xmldom.makeDocumentType(DOMNode) +create function gms_xmldom.makeDocumentType(n gms_xmldom.DOMNode) +returns gms_xmldom.DOMDocumentType +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + return [""] + + domNode = GD[n["id"]] + if domNode.nodeType == Node.DOCUMENT_TYPE_NODE: + return n + + nodeNames = ('None', 'Element', 'Attribute', 'Text', 'CDATASection', 'EntityReference', 'Entity', + 'ProcessingInstruction', 'Comment', 'Document', 'DocumentType', 'DocumentFragment', 'Notation') + nodeName = nodeNames[domNode.nodeType] + raise plpy.Error("Node type %s cannot be converted to the target type" %nodeName) +$$ language plpython3u package; + +--gms_xmldom.makeEntity(DOMNode) +create function gms_xmldom.makeEntity(n gms_xmldom.DOMNode) +returns gms_xmldom.DOMEntity +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + return [""] + + domNode = GD[n["id"]] + if domNode.nodeType == Node.ENTITY_NODE: + return n + + nodeNames = ('None', 'Element', 'Attribute', 'Text', 'CDATASection', 'EntityReference', 'Entity', + 'ProcessingInstruction', 'Comment', 'Document', 'DocumentType', 'DocumentFragment', 'Notation') + nodeName = nodeNames[domNode.nodeType] + raise plpy.Error("Node type %s cannot be converted to the target type" %nodeName) +$$ language plpython3u package; + +--gms_xmldom.makeNotation(DOMNode) +create function gms_xmldom.makeNotation(n gms_xmldom.DOMNode) +returns gms_xmldom.DOMNotation +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + return [""] + + domNode = GD[n["id"]] + if domNode.nodeType == Node.NOTATION_NODE: + return n + + nodeNames = ('None', 'Element', 'Attribute', 'Text', 'CDATASection', 'EntityReference', 'Entity', + 'ProcessingInstruction', 'Comment', 'Document', 'DocumentType', 'DocumentFragment', 'Notation') + nodeName = nodeNames[domNode.nodeType] + raise plpy.Error("Node type %s cannot be converted to the target type" %nodeName) +$$ language plpython3u package; + +--gms_xmldom.makeProcessingInstruction(DOMNode) +create function gms_xmldom.makeProcessingInstruction(n gms_xmldom.DOMNode) +returns gms_xmldom.DOMProcessingInstruction +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + return [""] + + domNode = GD[n["id"]] + if domNode.nodeType == Node.PROCESSING_INSTRUCTION_NODE: + return n + + nodeNames = ('None', 'Element', 'Attribute', 'Text', 'CDATASection', 'EntityReference', 'Entity', + 'ProcessingInstruction', 'Comment', 'Document', 'DocumentType', 'DocumentFragment', 'Notation') + nodeName = nodeNames[domNode.nodeType] + raise plpy.Error("Node type %s cannot be converted to the target type" %nodeName) +$$ language plpython3u package; + +--gms_xmldom.makeText(DOMNode) +create function gms_xmldom.makeText(n gms_xmldom.DOMNode) +returns gms_xmldom.DOMText +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + return [""] + + domNode = GD[n["id"]] + if domNode.nodeType == Node.TEXT_NODE: + return n + + nodeNames = ('None', 'Element', 'Attribute', 'Text', 'CDATASection', 'EntityReference', 'Entity', + 'ProcessingInstruction', 'Comment', 'Document', 'DocumentType', 'DocumentFragment', 'Notation') + nodeName = nodeNames[domNode.nodeType] + raise plpy.Error("Node type %s cannot be converted to the target type" %nodeName) +$$ language plpython3u package; + +--gms_xmldom.removeAttribute(DOMElement, VARCHAR2) +create function gms_xmldom.removeAttribute(elem gms_xmldom.DOMElement, name VARCHAR2) +returns void +as $$ + from xml.dom import minidom + if elem["id"] not in GD or not GD[elem["id"]]: + raise plpy.Error("DOMElement is empty or invalid") + + elemNode = GD[elem["id"]] + elemNode.removeAttribute(name) +$$ language plpython3u package; + +--gms_xmldom.removeAttribute(DOMElement, VARCHAR2, VARCHAR2) +create function gms_xmldom.removeAttribute(elem gms_xmldom.DOMElement, name VARCHAR2, ns VARCHAR2) +returns void +as $$ + from xml.dom import minidom + if elem["id"] not in GD or not GD[elem["id"]]: + raise plpy.Error("DOMElement is empty or invalid") + + elemNode = GD[elem["id"]] + elemNode.removeAttributeNS(ns, name) +$$ language plpython3u package; + +--gms_xmldom.removeNamedItem(DOMNamedNodeMap, VARCHAR2) +create function gms_xmldom.removeNamedItem(nnm gms_xmldom.DOMNamedNodeMap, name VARCHAR2) +returns gms_xmldom.DOMNode +as $$ + from xml.dom import minidom + if nnm["id"] not in GD or not GD[nnm["id"]]: + raise plpy.Error("DOMNamedNodeMap is empty or invalid") + + nnmNode = GD[nnm["id"]] + node = nnmNode.removeNamedItem(name) + resid = str(id(node)) + if resid not in GD: + GD[resid] = node + return [resid] +$$ language plpython3u package; + +--gms_xmldom.removeNamedItem(DOMNamedNodeMap, VARCHAR2, VARCHAR2) +create function gms_xmldom.removeNamedItem(nnm gms_xmldom.DOMNamedNodeMap, name VARCHAR2, ns VARCHAR2) +returns gms_xmldom.DOMNode +as $$ + from xml.dom import minidom + if nnm["id"] not in GD or not GD[nnm["id"]]: + raise plpy.Error("DOMNamedNodeMap is empty or invalid") + + nnmNode = GD[nnm["id"]] + node = nnmNode.removeNamedItemNS(ns, name) + resid = str(id(node)) + if resid not in GD: + GD[resid] = node + return [resid] +$$ language plpython3u package; + +--gms_xmldom.setData(DOMProcessingInstruction, VARCHAR2) +create function gms_xmldom.setData(pi gms_xmldom.DOMProcessingInstruction, data VARCHAR2) +returns void +as $$ + from xml.dom import minidom + if pi["id"] not in GD or not GD[pi["id"]]: + raise plpy.Error("DOMProcessingInstruction is empty or invalid") + + piNode = GD[pi["id"]] + piNode.nodeValue = data +$$ language plpython3u package; + +--gms_xmldom.setCharSet(DOMDocument, VARCHAR2) +create function gms_xmldom.setCharSet(doc gms_xmldom.DOMDocument, charset VARCHAR2) +returns void +as $$ + from xml.dom import minidom + if doc["id"] not in GD or not GD[doc["id"]]: + raise plpy.Error("DOMDocument is empty or invalid") + + docNode = GD[doc["id"]] + docNode.encoding = charset +$$ language plpython3u package; + +--gms_xmldom.setDocType(DOMDocument, VARCHAR2, VARCHAR2, VARCHAR2) +create function gms_xmldom.setDocType(doc gms_xmldom.DOMDocument, name VARCHAR2, sysid VARCHAR2, pubid VARCHAR2) +returns void +as $$ + from xml.dom import minidom + if doc["id"] not in GD or not GD[doc["id"]]: + raise plpy.Error("DOMDocument is empty or invalid") + + docNode = GD[doc["id"]] + if docNode.doctype is None: + domNode = minidom.getDOMImplementation() + dtNode = domNode.createDocumentType(name, pubid, sysid) + resid = str(id(dtNode)) + if resid not in GD: + GD[resid] = dtNode + docNode.doctype = GD[resid] + docNode.insertBefore(dtNode, docNode._get_firstChild()); + else: + docNode.doctype.name = name + docNode.doctype.systemId = sysid + docNode.doctype.publicId = pubid +$$ language plpython3u package; + +--gms_xmldom.setStandalone(DOMDocument, VARCHAR2) +create function gms_xmldom.setStandalone(doc gms_xmldom.DOMDocument, newvalue VARCHAR2) +returns void +as $$ + from xml.dom import minidom + if doc["id"] not in GD or not GD[doc["id"]]: + raise plpy.Error("DOMDocument is empty or invalid") + + docNode = GD[doc["id"]] + docNode.standalone = newvalue +$$ language plpython3u package; + +--gms_xmldom.setNodeValue(DOMNode, VARCHAR2) +create function gms_xmldom.setNodeValue(n gms_xmldom.DOMNode, nvalue VARCHAR2) +returns void +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + raise plpy.Error("DOMNode is empty or invalid") + + nNode = GD[n["id"]] + if nNode.nodeType == Node.ATTRIBUTE_NODE: + nNode._set_value(nvalue) + elif nNode.nodeType == Node.TEXT_NODE or nNode.nodeType == Node.CDATA_SECTION_NODE or nNode.nodeType == Node.COMMENT_NODE: + nNode.data = nvalue + elif nNode.nodeType == Node.PROCESSING_INSTRUCTION_NODE: + nNode._set_nodeValue(nvalue) + else: + plpy.Error("setNodeValue is not allowed") +$$ language plpython3u package; + +--gms_xmldom.setPrefix(DOMNode, VARCHAR2) +create function gms_xmldom.setPrefix(n gms_xmldom.DOMNode, prefix VARCHAR2) +returns void +as $$ + from xml.dom import minidom + from xml.dom import Node + if n["id"] not in GD or not GD[n["id"]]: + raise plpy.Error("DOMNode is empty or invalid") + + nNode = GD[n["id"]] + if nNode.nodeType == Node.ATTRIBUTE_NODE: + value = nNode._get_value() + name = nNode._get_name() + name = prefix + ":" + name + nNode.ownerElement.setAttribute(name, value) + nNode.prefix = prefix + elif nNode.nodeType == Node.ELEMENT_NODE: + #tag = prefix + ":" + nNode._get_tagName() + #nNode.tagName = tag + nNode.prefix = prefix + elif nNode.nodeType == Node.PROCESSING_INSTRUCTION_NODE: + name = prefix + ":" + nNode._get_nodeName() + nNode._set_nodeName(name) + else: + raise plpy.Error("Only ATTRIBUTE_NODE、ELEMENT_NODE and PROCESSING_INSTRUCTION_NODE could set prefix") +$$ language plpython3u package; + +--gms_xmldom.setValue(DOMAttr, VARCHAR2) +create function gms_xmldom.setValue(attr gms_xmldom.DOMAttr, value VARCHAR2) +returns void +as $$ + from xml.dom import minidom + if attr["id"] not in GD or not GD[attr["id"]]: + raise plpy.Error("DOMAttr is empty or invalid") + + attrNode = GD[attr["id"]] + attrNode.nodeValue = value +$$ language plpython3u package; diff --git a/src/common/pl/plpython/sql/plpython_check_writetofile.sql b/src/common/pl/plpython/sql/plpython_check_writetofile.sql new file mode 100644 index 0000000000..3035f34e8d --- /dev/null +++ b/src/common/pl/plpython/sql/plpython_check_writetofile.sql @@ -0,0 +1,35 @@ +\! cat /tmp/attribute_xmldom.xml +\! rm /tmp/attribute_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/cdatasection_xmldom.xml +\! rm /tmp/cdatasection_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/comment_xmldom.xml +\! rm /tmp/comment_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/document_frag_xmldom.xml +\! rm /tmp/document_frag_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/document_type_xmldom.xml +\! rm /tmp/document_type_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/document_xmldom.xml +\! rm /tmp/document_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/document2_xmldom.xml +\! rm /tmp/document2_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/element_xmldom.xml +\! rm /tmp/element_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/entity_xmldom.xml +\! rm /tmp/entity_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/notation_xmldom.xml +\! rm /tmp/notation_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/processinstruncation_xmldom.xml +\! rm /tmp/processinstruncation_xmldom.xml -rf > /dev/null 2>&1 + +\! cat /tmp/text_xmldom.xml +\! rm /tmp/text_xmldom.xml -rf > /dev/null 2>&1 diff --git a/src/common/pl/plpython/sql/plpython_gms_xmldom2.sql b/src/common/pl/plpython/sql/plpython_gms_xmldom2.sql new file mode 100644 index 0000000000..317a78295b --- /dev/null +++ b/src/common/pl/plpython/sql/plpython_gms_xmldom2.sql @@ -0,0 +1,646 @@ +-- test for DOMCharacterData +-- include 5 functions: appenddata, setdata, insertdata, replacedata and deletedata +declare + v_clob clob; + v_doc gms_xmldom.domdocument; + v_nodelist gms_xmldom.domnodelist; + v_node1 gms_xmldom.domnode; + v_chardata1 gms_xmldom.DOMCharacterData; + v_char1 varchar2(100); +begin + v_clob:=' + + + xmldom test + DOMCharacterData + origin data + + '; + + v_doc := gms_xmldom.newdomdocument(v_clob); + v_nodelist := gms_xmldom.getelementsbytagname(v_doc, 'persons'); + v_node1 := gms_xmldom.getfirstchild(gms_xmldom.item(v_nodelist, 0)); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + v_chardata1 := gms_xmldom.makeCharacterData(v_node1); + raise notice '%', (gms_XMLDOM.GETLENGTH(v_chardata1)); + gms_xmldom.setdata(v_chardata1, 'laoliu'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.insertdata(v_chardata1, 3, 'XXX'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.insertdata(v_chardata1, 9, 'wude'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.replacedata(v_chardata1, 13, 5, 'YYYY'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.replacedata(v_chardata1, 6, 3, 'ZZZZ'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.replacedata(v_chardata1, 18, 0, 'YYYY'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.replacedata(v_chardata1, 6, 0, 'AAAA'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.deletedata(v_chardata1, 26, 3); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.deletedata(v_chardata1, 9, 3); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.deletedata(v_chardata1, 9, 0); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); + + gms_xmldom.appenddata(v_chardata1, '_tail'); + v_char1 := gms_xmldom.getnodevalue(v_node1); + raise notice '%', (v_char1); +end; +/ + +-- test notation and entity +-- include 8 functions: findnotation, getnotations, makeentity, makenotation and getnotationname +-- getdoctype, getentities, makeDocumentType +declare + v_clob clob; + v_doc gms_xmldom.domdocument; + v_node1 gms_xmldom.domnode; + v_node gms_xmldom.domnode; + v_entity gms_xmldom.DOMENTITY; + v_notatioin gms_xmldom.DOMNOTATION; + v_doctype gms_xmldom.DOMDOCUMENTTYPE; + v_map gms_xmldom.DOMNamedNodeMap; + v_char1 varchar2(100); +begin + v_clob:=' + + + + + + + + + +]> + + + Arwen + 123 + + + tom + 456 + +'; + + v_doc := gms_xmldom.newdomdocument(v_clob); + v_doctype := gms_xmldom.getdoctype(v_doc); + v_notatioin := gms_xmldom.findnotation(v_doctype, 'PNG'); + v_char1 := gms_xmldom.getNodeName(gms_xmldom.MAKENODE(v_notatioin)); + raise notice 'notataion name: %', (v_char1); + + v_map := gms_xmldom.getnotations(v_doctype); + raise notice 'notationi map length: %', (gms_XMLDOM.GETLENGTH(v_map)); + + v_node1 := gms_xmldom.item(v_map, 0); + v_notatioin := gms_xmldom.makenotation(v_node1); + v_char1 := gms_xmldom.getNodeName(gms_xmldom.MAKENODE(v_notatioin)); + raise notice 'notataion name: %', (v_char1); + + v_map := gms_xmldom.getentities(v_doctype); + raise notice 'entity map length: %', (gms_XMLDOM.GETLENGTH(v_map)); + + v_node1 := gms_xmldom.item(v_map, 2); + v_entity := gms_xmldom.makeentity(v_node1); + v_char1 := gms_xmldom.getnotationname(v_entity); + raise notice 'entity notation name: %', (v_char1); + + v_node := gms_XMLDOM.makenode(v_doctype); + v_doctype := gms_xmldom.makeDocumentType(v_node); +end; +/ + +-- test setdoctype +-- include 1 functions: setdoctype +declare + v_clob clob; + v_doc gms_xmldom.domdocument; + v_doctype gms_xmldom.DOMDOCUMENTTYPE; + v_char1 varchar2(1000); +begin + v_clob := ' + + + Arwen + 123 + +'; + + v_doc := gms_xmldom.newdomdocument(v_clob); + + gms_xmldom.SETDOCTYPE(v_doc, 'staff', 'http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd', '-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN'); + v_char1 := gms_xmldom.writetobuffer(v_doc, v_char1); + --输出修改后的clob内容 + raise notice '%', ('文档为:' || v_char1); + + v_doctype := gms_xmldom.getdoctype(v_doc); + v_char1 := gms_xmldom.writetobuffer(gms_xmldom.makenode(v_doctype), v_char1); + raise notice '%', ('DTD为:' || v_char1); +end; +/ + +-- test for docfragment +-- include 8 functions: normalize, writetofile(4), freeelement, freedocfrag and makedocumentfragment +DECLARE + v_clob clob; + doc gms_XMLDOM.DOMDocument; + docelement gms_xmldom.DOMElement; + docelemnode gms_XMLDOM.DOMNode; + docfragment gms_XMLDOM.DOMDocumentFragment; + docfragmentnode gms_XMLDOM.DOMnode; + createelem gms_XMLDOM.DOMElement; + elemnode gms_XMLDOM.DOMNode; + text gms_XMLDOM.DOMText; + textnode gms_XMLDOM.DOMNode; + resNode gms_XMLDOM.DOMNode; + buf varchar2(4000); +BEGIN + v_clob := ' + +'; + + --返回新的document实例 + doc := gms_XMLDOM.newDOMDocument(v_clob); + + docfragment := gms_XMLDOM.createDocumentFragment(doc); + docfragmentnode := gms_XMLDOM.makeNode(docfragment); + docfragment := gms_xmldom.makedocumentfragment(docfragmentnode); + + --在文档片段添加内容 + --创建DOMElement对象 + createelem := gms_XMLDOM.createElement(doc, 'test'); + elemnode := gms_XMLDOM.makeNode(createelem); + + --创建内容 + text := gms_XMLDOM.createTextnode(doc, 'testtext1'); + textnode := gms_XMLDOM.makeNode(text); + + --添加到指定位置 + resNode := gms_XMLDOM.appendChild(elemnode, textnode); + text := gms_XMLDOM.createTextnode(doc, 'testtext2'); + textnode := gms_XMLDOM.makeNode(text); + resNode := gms_XMLDOM.appendChild(elemnode, textnode); + resNode := gms_XMLDOM.appendChild(docfragmentnode, elemnode); + + --将片段加入到文档 + docelement := gms_xmldom.getDocumentElement(doc); + docelemnode := gms_XMLDOM.makeNode(docelement); + resNode := gms_XMLDOM.appendChild(docelemnode, docfragmentnode); + + buf := gms_xmldom.writetobuffer(doc, buf); + --输出修改后的clob内容 + raise notice '%', ('文档为:' || buf); + + buf := gms_xmldom.writetobuffer(docelemnode, buf); + --输出修改后的clob内容 + raise notice '%', ('normalize前的文档片段为:' || buf); + + --normalize element + gms_xmldom.normalize(createelem); + + buf := gms_xmldom.writetobuffer(docelemnode, buf); + --输出修改后的clob内容 + raise notice '%', ('normalize后的文档片段为:' || buf); + + --释放 + gms_xmldom.freeelement(createelem); + gms_xmldom.freeelement(docelement); + gms_xmldom.freedocfrag(docfragment); +END; +/ + +-- test for attribute remove and setvalue +-- include 8 functions: setcharset, setstandalone, removenameditem, removenameditem-ns, removeattribute, +-- removeattribute-ns, makeattr, attr-setvalue +DECLARE + var clob; + doc gms_XMLDOM.DOMDocument; + docNode gms_XMLDOM.DOMNode; + node gms_XMLDOM.DOMNode; + docelem gms_XMLDOM.DOMElement; + attrelem gms_XMLDOM.DOMElement; + nodelist gms_XMLDOM.DOMNodelist; + attrmap gms_XMLDOM.DOMNamedNodeMap; + length integer; + isNull boolean; + attr gms_xmldom.DOMAttr; + attrnode gms_XMLDOM.DOMNode; + doctype gms_xmldom.DOMDocumentType; + buf varchar2(4000); +BEGIN + var := ' + + + learning math + 张三 + 561 + +'; + --返回新的document实例 + doc := gms_xmldom.newDOMDocument(var); + + --设置字符集, DTD, standalone属性 + gms_xmldom.setcharset(doc, 'UTF-16'); + gms_xmldom.setstandalone(doc, 'true'); + buf := gms_xmldom.writetobuffer(doc, buf); + --输出修改后的clob内容 + raise notice '%', ('文档为:' || buf); + + docNode := gms_xmldom.makeNode(doc); + docelem := gms_xmldom.getDocumentElement(doc); + nodelist := gms_xmldom.getElementsByTagName(docelem, 'book'); + node := gms_xmldom.item(nodelist, 0); + --获取第一个EMP节点的属性 + attrmap := gms_xmldom.getAttributes(node); + isNull := gms_xmldom.isNull(attrmap); + raise notice '%', ('isNull(DOMNamedNodeMap):' || case when isNull then 'Y' else 'N' end); + + --查看map的长度验证结果 + length := gms_xmldom.getlength(attrmap); + raise notice '%', ('第一个book节点的属性长度为:' || length ); + + --删除一个属性 + docNode := gms_xmldom.removenameditem(attrmap, 'year'); + buf := gms_xmldom.writetobuffer(node, buf); + --输出修改后的clob内容 + raise notice '%', ('属性为:' || buf); + + --删除另一个属性 + attrelem := gms_xmldom.makeElement(node); + gms_xmldom.removeattribute(attrelem, 'lang'); + buf := gms_xmldom.writetobuffer(node, buf); + --输出修改后的clob内容 + raise notice '%', ('属性为:' || buf); + + --删除带namespace的属性 + docNode := gms_xmldom.removenameditem(attrmap, 'year', 'http://example.com/ns'); + buf := gms_xmldom.writetobuffer(node, buf); + --输出修改后的clob内容 + raise notice '%', ('属性为:' || buf); + + --删除另一个带namespace的属性 + gms_xmldom.removeattribute(attrelem, 'lang', 'http://example.com/ns'); + buf := gms_xmldom.writetobuffer(node, buf); + --输出修改后的clob内容 + raise notice '%', ('属性为:' || buf); + + --修改属性值 + attrnode := gms_xmldom.item(attrmap, 0); + attr := gms_xmldom.makeattr(attrnode); + gms_xmldom.setvalue(attr, 'yuwen'); + buf := gms_xmldom.writetobuffer(node, buf); + raise notice '%', ('属性值为:' || buf); + + --修改属性的namespace值 + gms_xmldom.setPrefix(attrnode, 'nns'); + buf := gms_xmldom.writetobuffer(node, buf); + raise notice '%', ('属性值为:' || buf); +END; +/ + +-- test for make funcation +-- include 6 functions: makeprocessinginstruction, maketext, makecomment, makecdatasection +-- setdata, setPrefix +DECLARE + var clob; + doc gms_XMLDOM.DOMDocument; + docNode gms_XMLDOM.DOMNode; + piinode gms_XMLDOM.DOMNode; + resnode gms_XMLDOM.DOMNode; + booknode gms_XMLDOM.DOMNode; + booklistnode gms_XMLDOM.DOMNode; + tmpnode gms_XMLDOM.DOMNode; + pii gms_XMLDOM.DOMPROCESSINGINSTRUCTION; + buf varchar2(4000); + docelem gms_XMLDOM.DOMElement; + item_elmt gms_XMLDOM.DOMElement; + item_text gms_XMLDOM.DOMTEXT; + nodelist gms_XMLDOM.DOMNodelist; + comm gms_XMLDOM.domcomment; + cdata gms_XMLDOM.DOMCDATASECTION; +BEGIN + var := ' + + + learning math + 张三 + +'; + --返回新的document实例 + doc := gms_xmldom.newDOMDocument(var); + --根节点 + docNode := gms_xmldom.MAKENODE(doc); + docelem := gms_xmldom.getDocumentElement(doc); + nodelist := gms_xmldom.getElementsByTagName(docelem, 'book'); + booknode := gms_xmldom.item(nodelist, 0); + booklistnode := gms_xmldom.getFirstChild(docNode); + + pii := gms_xmldom.CREATEPROCESSINGINSTRUCTION(doc, 'xml-stylesheet', 'type="text/xsl" href="stylesheet.xsl"'); + piinode := gms_xmldom.MAKENODE(pii); + gms_xmldom.setPrefix(piinode, 'xss'); + resnode := gms_xmldom.insertBefore(docNode, piinode, booklistnode); + + buf := gms_xmldom.writetobuffer(resnode, buf); + --输出内容 + raise notice '%', ('ProcessInstrunction为:' || buf); + + -- setdata + gms_xmldom.SETDATA(pii, 'pii first test'); + buf := gms_xmldom.writetobuffer(resnode, buf); + --输出内容 + raise notice '%', ('ProcessInstrunction setdata 后为:' || buf); + + pii := gms_xmldom.makeprocessinginstruction(resnode); + -- setdata again + gms_xmldom.SETDATA(pii, 'pii 2nd test'); + buf := gms_xmldom.writetobuffer(resnode, buf); + --输出内容 + raise notice '%', ('ProcessInstrunction setdata 后为:' || buf); + + -- maketext test + item_elmt := gms_xmldom.CREATEELEMENT(doc, 'eno'); + resnode := gms_xmldom.APPENDCHILD(booknode, gms_xmldom.MAKENODE(item_elmt)); + item_text := gms_xmldom.CREATETEXTNODE(doc, '123'); + tmpnode := gms_xmldom.APPENDCHILD(resnode, gms_xmldom.MAKENODE(item_text)); + + item_text := gms_xmldom.maketext(tmpnode); + buf := gms_xmldom.writetobuffer(resnode, buf); + --输出内容 + raise notice '%', ('element元素为:' || buf); + + -- make comment + comm := gms_xmldom.createComment(doc, 'This is a comment test'); + resnode := gms_xmldom.insertBefore(docNode, gms_xmldom.MAKENODE(comm), booklistnode); + comm := gms_xmldom.makecomment(resnode); + + -- make cdatasection + cdata := gms_xmldom.createCDATASection(doc, 'cdatasection example'); + resnode := gms_xmldom.APPENDCHILD(booknode, gms_xmldom.MAKENODE(cdata)); + cdata := gms_xmldom.makecdatasection(resnode); + buf := gms_xmldom.writetobuffer(gms_xmldom.MAKENODE(cdata), buf); + --输出内容 + raise notice '%', ('cdatasection为:' || buf); + + --输出文档内容 + buf := gms_xmldom.writetobuffer(docNode, buf); + raise notice '%', ('文档内容为:' || buf); +END; +/ + +--test for setnodevalue +--include 1 functions: setnodevalue +DECLARE + var clob; + doc gms_xmldom.DOMDocument; + node gms_xmldom.DOMNode; + docelem gms_xmldom.DOMElement; + nodelist gms_xmldom.DOMNodelist; + attrmap gms_xmldom.DOMNamedNodeMap; + attr gms_xmldom.DOMAttr; + attrnode gms_xmldom.DOMNode; + doctype gms_xmldom.DOMDocumentType; + data_elmt gms_xmldom.DOMtext; + cdata gms_xmldom.DOMCDATASECTION; + entref gms_xmldom.DOMENTITYREFERENCE; + enti gms_xmldom.DOMENTITY; + v_map gms_xmldom.DOMNamedNodeMap; + v_node gms_xmldom.DOMNode; + comm gms_xmldom.DOMComment; + docfragment gms_xmldom.DOMDocumentFragment; + pii gms_xmldom.DOMPROCESSINGINSTRUCTION; + buf varchar2(4000); +BEGIN + var := ' + + + + + + + + + + +]> + + + Arwen + 123 + + + tom + 456 + +'; + --返回新的document实例 + doc := gms_xmldom.newDOMDocument(var); + + docelem := gms_xmldom.getDocumentElement(doc); + nodelist := gms_xmldom.getElementsByTagName(docelem, 'member'); + node := gms_xmldom.item(nodelist, 0); + buf := gms_xmldom.writetobuffer(node, buf); + raise notice '%', (buf); + + --属性节点setnodevalue + attrmap := gms_xmldom.getAttributes(node); + attrnode := gms_xmldom.item(attrmap, 0); + buf := gms_xmldom.getnodevalue(attrnode); + raise notice '%', (buf); + gms_xmldom.setnodevalue(attrnode, 'xxxxx'); + buf := gms_xmldom.getnodevalue(attrnode); + raise notice '%', (buf); + + --text节点setnodevalue + data_elmt := gms_xmldom.createtextnode(doc, 'DataTag'); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(data_elmt)); + raise notice '%', (buf); + gms_xmldom.setnodevalue(gms_xmldom.makenode(data_elmt), 'xxxxx'); + buf := gms_xmldom.writetobuffer(gms_xmldom.makenode(data_elmt), buf); + raise notice '%', (buf); + + --CDATA_SECTION节点setnodevalue + cdata := gms_xmldom.createCDATASection(doc, 'cdatasection example'); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(cdata)); + raise notice '%', (buf); + gms_xmldom.setnodevalue(gms_xmldom.makenode(cdata), 'xxxxx'); + buf := gms_xmldom.writetobuffer(gms_xmldom.makenode(cdata), buf); + raise notice '%', (buf); + + --实体setnodevalue + doctype := gms_xmldom.getdoctype(doc); + v_map := gms_xmldom.getentities(doctype); + v_node := gms_xmldom.item(v_map, 1); + buf := gms_xmldom.getnodevalue(v_node); + raise notice '%', (buf); + + --notation setnodevalue + v_map := gms_xmldom.getnotations(doctype); + v_node := gms_xmldom.item(v_map, 0); + buf := gms_xmldom.getnodevalue(v_node); + raise notice '%', (buf); + + --comment setnodevalue + comm := gms_xmldom.createcomment(doc, 'this is a comment'); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(comm)); + raise notice '%', (buf); + gms_xmldom.setnodevalue(gms_xmldom.makenode(comm), 'xxxxx'); + buf := gms_xmldom.writetobuffer(gms_xmldom.makenode(comm), buf); + raise notice '%', (buf); + + --documentfragment setnodevalue + docfragment := gms_xmldom.createDocumentFragment(doc); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(docfragment)); + raise notice '%', (buf); + + --processing instruction + pii := gms_xmldom.CREATEPROCESSINGINSTRUCTION(doc, 'xml-stylesheet', 'type="text/xsl" href="stylesheet.xsl"'); + buf := gms_xmldom.getnodevalue(gms_xmldom.makenode(pii)); + raise notice '%', (buf); + gms_xmldom.setnodevalue(gms_xmldom.makenode(pii), 'xxxxx'); + buf := gms_xmldom.writetobuffer(gms_xmldom.makenode(pii), buf); + raise notice '%', (buf); +END; +/ + +--test for writetofile +--include 4 functions: writetofile +declare + v_clob clob; + v_doc gms_xmldom.domdocument; + v_node1 gms_xmldom.domnode; + v_entity gms_xmldom.DOMENTITY; + v_notatioin gms_xmldom.DOMNOTATION; + v_doctype gms_xmldom.DOMDOCUMENTTYPE; + v_map gms_xmldom.DOMNamedNodeMap; + elemnode gms_XMLDOM.DOMNode; + attrnode gms_XMLDOM.DOMNode; + docelem gms_XMLDOM.DOMElement; + attrelem gms_XMLDOM.DOMElement; + nodelist gms_XMLDOM.DOMNodelist; + attrmap gms_XMLDOM.DOMNamedNodeMap; + data_elmt gms_XMLDOM.DOMtext; + cdata gms_XMLDOM.DOMCDATASECTION; + pii gms_XMLDOM.DOMPROCESSINGINSTRUCTION; + comm gms_XMLDOM.DOMComment; + docfragment gms_XMLDOM.DOMDocumentFragment; + resNode gms_XMLDOM.DOMNode; + textnode gms_XMLDOM.DOMNode; + createelem gms_XMLDOM.DOMElement; + v_char1 varchar2(100); +begin + v_clob:=' + + + + + + + + + + +]> + + + Arwen + 123 + + + tom + 456 + +'; + + v_doc := gms_xmldom.newdomdocument(v_clob); + + v_doctype := gms_xmldom.getdoctype(v_doc); + v_notatioin := gms_xmldom.findnotation(v_doctype, 'PNG'); + + --notation + gms_xmldom.writetofile(gms_XMLDOM.makenode(v_notatioin), '/tmp/notation_xmldom.xml', 'UTF-8'); + + v_map := gms_xmldom.getentities(v_doctype); + --实体写文件 + v_node1 := gms_xmldom.item(v_map, 2); + gms_xmldom.writetofile(v_node1, '/tmp/entity_xmldom.xml', 'UTF-8'); + + --元素节点写文件 + docelem := gms_xmldom.getDocumentElement(v_doc); + nodelist := gms_xmldom.getElementsByTagName(docelem, 'member'); + elemnode := gms_xmldom.item(nodelist, 0); + gms_xmldom.writetofile(elemnode, '/tmp/element_xmldom.xml', 'UTF-8'); + + --属性节点写文件 + attrmap := gms_xmldom.getAttributes(elemnode); + attrnode := gms_xmldom.item(attrmap, 0); + gms_xmldom.writetofile(attrnode, '/tmp/attribute_xmldom.xml', 'UTF-8'); + + --text节点 + data_elmt := gms_xmldom.createtextnode(v_doc, 'DataTag'); + v_node1 := gms_XMLDOM.makenode(data_elmt); + gms_xmldom.writetofile(v_node1, '/tmp/text_xmldom.xml', 'UTF-8'); + + --cdatasection + cdata := gms_XMLDOM.createCDATASection(v_doc, 'cdatasection example'); + v_node1 := gms_XMLDOM.makenode(cdata); + gms_xmldom.writetofile(v_node1, '/tmp/cdatasection_xmldom.xml', 'UTF-8'); + + --processinstruncation + pii := gms_XMLDOM.CREATEPROCESSINGINSTRUCTION(v_doc, 'xml-stylesheet', 'type="text/xsl" href="stylesheet.xsl"'); + v_node1 := gms_XMLDOM.makenode(pii); + gms_xmldom.writetofile(v_node1, '/tmp/processinstruncation_xmldom.xml', 'UTF-8'); + + --comment + comm := gms_XMLDOM.createcomment(v_doc, 'this is a comment'); + v_node1 := gms_XMLDOM.makenode(comm); + gms_xmldom.writetofile(v_node1, '/tmp/comment_xmldom.xml', 'UTF-8'); + + --DTD + gms_xmldom.writetofile(gms_XMLDOM.makenode(v_doctype), '/tmp/document_type_xmldom.xml', 'UTF-8'); + + --document fragment + docfragment := gms_XMLDOM.createDocumentFragment(v_doc); + createelem := gms_XMLDOM.createElement(v_doc, 'test'); + elemnode := gms_XMLDOM.makeNode(createelem); + + data_elmt := gms_XMLDOM.createTextnode(v_doc, 'testtext1'); + textnode := gms_XMLDOM.makeNode(data_elmt); + + resNode := gms_XMLDOM.appendChild(elemnode, textnode); + data_elmt := gms_XMLDOM.createTextnode(v_doc, 'testtext2'); + textnode := gms_XMLDOM.makeNode(data_elmt); + resNode := gms_XMLDOM.appendChild(elemnode, textnode); + resNode := gms_XMLDOM.appendChild(gms_XMLDOM.makeNode(docfragment), elemnode); + gms_xmldom.writetofile(gms_XMLDOM.makenode(docfragment), '/tmp/document_frag_xmldom.xml', 'UTF-8'); + + --document + gms_xmldom.setstandalone(v_doc, 'Yes'); + gms_xmldom.writetofile(gms_XMLDOM.makenode(v_doc), '/tmp/document_xmldom.xml', 'UTF-8'); + + gms_xmldom.writetofile(v_doc, '/tmp/document2_xmldom.xml'); +end; +/ -- Gitee