#DBMS_XMLDOM
XML DOM(XML Document Object Model)定义了所有XML元素的对象和属性,是用于访问XML文件完成获取、更改、添加或删除XML元素的标准。
DBMS_XMLDOM高级包提供了一组内置的存储过程、常量、数据结构,帮助用户对XML文档进行访问和处理。
# 预定义常量
DBMS_XMLDOM系统包定义了一组常量,供DBMS_XMLDOM高级包相关函数及子程序调用。下表为详细信息。
| 名称 | 数据类型 | 值 | 描述 |
|---|---|---|---|
| ELEMENT_NODE | INTEGER | 1 | 元素节点 |
| ATTRIBUTE_NODE | INTEGER | 2 | 属性节点 |
| TEXT_NODE | INTEGER | 3 | 文本节点 |
| CDATA_SECTION_NODE | INTEGER | 4 | 预留字段 |
| ENTITY_REFERENCE_NODE | INTEGER | 5 | 预留字段 |
| ENTITY_NODE | INTEGER | 6 | 预留字段 |
| PROCESSING_INSTRUCTION_NODE | INTEGER | 7 | 预留字段 |
| COMMENT_NODE | INTEGER | 8 | 注释节点 |
| DOCUMENT_NODE | INTEGER | 9 | 文档节点 |
| DOCUMENT_TYPE_NODE | INTEGER | 10 | 文档类型节点 |
| DOCUMENT_FRAGMENT_NODE | INTEGER | 11 | 预留字段 |
| NOTATION_NODE | INTEGER | 12 | 符号节点 |
# 数据结构
DBMS_XMLDOM系统包定义了一组数据结构,供DBMS_XMLDOM高级包相关函数及子程序调用。下表为详细信息。
| 名称 | 数据类型 | 描述 |
|---|---|---|
| DOMDocument | RECORD | 实现了对XML文档对象的访问接口。 |
| DOMNode | RECORD | 实现了对XML文档对象中的节点的访问接口。 |
| DOMNodeList | RECORD | 实现了对XML文档对象中的节点列表的访问接口。 |
| DOMAttr | RECORD | 实现了对XML文档对象中的属性的访问接口。 |
| DOMElement | RECORD | 实现了对XML文档对象中的元素的访问接口。 |
| DOMText | RECORD | 实现了对XML文档对象中的文本的访问接口。 |
# 子程序说明
# appendChild Function
该函数用于为指定父节点追加子节点,追加的子节点将在末尾进行插入。
DBMS_XMLDOM.appendChild(n IN DOMNode, newChild IN DOMNode) RETURN DOMNode;
| 参数 | 用途 |
|---|---|
| n | 需要追加子节点的父节点 |
| newChild | 待追加的节点 |
# createElement Functions
该函数用于创建一个新的元素节点。
DBMS_XMLDOM.createElement(doc IN DOMDocument, tagName IN VARCHAR2) RETURN DOMElement;
DBMS_XMLDOM.createElement(doc IN DOMDocument, tagName IN VARCHAR2, ns IN VARCHAR2) RETURN DOMElement;
| 参数 | 用途 |
|---|---|
| doc | 待创建新元素节点的XML文档。如果指定的doc文档为null,则返回null;如果指定的doc已经被释放,则报错。 |
| tagName | 设置新元素名称 |
| ns | 设置新元素所属命名空间 |
示例
DECLARE
doc DBMS_XMLDOM.DOMDocument;
root_node DBMS_XMLDOM.DOMElement;
BEGIN
-- 创建XML文档DOM对象
doc := DBMS_XMLDOM.newDOMDocument;
-- 创建根节点,文档未释放时操作成功
root_node := DBMS_XMLDOM.createElement(doc, 'Root');
-- 释放文档
DBMS_XMLDOM.freeDocument(doc);
-- 在已释放的文档中尝试再次创建节点将触发错误
root_node := DBMS_XMLDOM.createElement(doc, 'NewRoot');
END;
/
YAS-07202 plugin execution error, invalid PL/SQL DOM handle
YAS-04015 at "SYS.DBMS_XMLDOM.CREATEELEMENT", line 78
YAS-04015 at line 19
# createTextNode Function
该函数用于创建一个新的文本节点。
DBMS_XMLDOM.createTextNode(doc IN DOMDocument, data IN VARCHAR2) RETURN DOMText;
| 参数 | 用途 |
|---|---|
| doc | 待创建文本节点的XML文档。如果指定的doc文档为null,则返回null;如果指定的doc已经被释放,则报错。 |
| data | 待写入XML文档对象的文本内容 |
# freeDocument Procedure
该存储过程用于创建释放一个XML文档。
DBMS_XMLDOM.freeDocument(doc IN DOMDocument);
| 参数 | 用途 |
|---|---|
| doc | 待创建新元素的XML文档。如果指定的doc文档为null,则返回null。 |
# getAttribute Functions
该函数用于获取一个元素节点的属性值。如果查找的属性不存在,则返回NULL。
DBMS_XMLDOM.getAttribute(elem IN DOMElement, name IN VARCHAR2) RETURN varchar2;
DBMS_XMLDOM.getAttribute(elem IN DOMElement, name IN VARCHAR2, ns IN VARCHAR2) RETURN varchar2;
| 参数 | 用途 |
|---|---|
| elem | 元素名称 |
| Name | 属性名词 |
| ns | 元素所属命名空间 |
# getChildNodes Function
该函数用于获取节点的所有子节点列表。
DBMS_XMLDOM.getChildNodes(n IN DOMNode) RETURN DOMNodeList;
| 参数 | 用途 |
|---|---|
| n | 元素节点名称 |
# getChildrenByTagName Functions
该函数用于获取元素的所有子节点。
-- Returns children of the DOMELEMENT given the tag name
DBMS_XMLDOM.getChildrenByTagName
(elem IN DOMElement,
name varchar2)
RETURN DOMNodeList;
-- Returns children of the DOMELEMENT given the tag name and namespace
DBMS_XMLDOM.getChildrenByTagName
(elem IN DOMElement,
name varchar2,
ns varchar2)
RETURN DOMNodeList;
| 参数 | 用途 |
|---|---|
| elem | 元素名称 |
| Name | 属性名称 |
| ns | 元素所属命名空间 |
# getDocumentElement Function
该函数用于获取XML文档的根元素。
DBMS_XMLDOM.getDocumentElement(doc IN DOMDocument) RETURN DOMElement;
| 参数 | 用途 |
|---|---|
| doc | XML DOMDocument文档。如果指定的doc文档为null,则返回null;如果指定的doc已经被释放,则报错。 |
# getElementsByTagName Functions
该函数用于获取指定节点的所有子节点列表。
如果查找的对象为空(DOMElement或DOMDocument),或者没有指定节点名称,则函数返回NULL。
DBMS_XMLDOM.getElementsByTagName
(elem IN DOMElement,
name IN VARCHAR2)
RETURN DOMNodeList;
DBMS_XMLDOM.getElementsByTagName
(elem IN DOMElement,
name IN VARCHAR2,
ns varchar2)
RETURN DOMNodeList;
DBMS_XMLDOM.getElementsByTagName
(doc IN DOMDocument,
tagname IN VARCHAR2)
RETURN DOMNodeList;
| 参数 | 用途 |
|---|---|
| elem | 元素名称 |
| Name | 指定需要查找的节点名称 |
| ns | 指定需要查找的元素节点所属命名空间 |
| doc | 指定需要查找的XML DOMDocument文档。 |
| tagName | 指定需要查找的元素节点的tag |
# getFirstChild Function
该函数用于获取指定节点的第一个子节点。
DBMS_XMLDOM.getFirstChild(n IN DOMNode) RETURN DOMNode;
| 参数 | 用途 |
|---|---|
| n | 元素节点名称 |
# getLength Function
该函数用于从节点列表中获取节点数量,需要依赖其他函数先获取节点列表。
DBMS_XMLDOM.getLength(nl IN DOMNodeList) RETURN INTEGER;
| 参数 | 用途 |
|---|---|
| nl | 节点列表 |
# getNodeName Function
该函数用于获取节点名称。
DBMS_XMLDOM.getNodeName(n IN DOMNode) RETURN VARCHAR2;
| 参数 | 用途 |
|---|---|
| n | 节点名称 |
# getNodeValue Function
该函数用于获取节点数据。
DBMS_XMLDOM.getNodeValue(n IN DOMNode) RETURN VARCHAR2;
| 参数 | 用途 |
|---|---|
| n | 节点名称 |
# getParentNode Function
该函数用于获取父节点。
DBMS_XMLDOM.getParentNode(n IN DOMNode) RETURN DOMNode;
| 参数 | 用途 |
|---|---|
| n | 节点名称 |
# getValue Function
该函数用于获取属性值。
DBMS_XMLDOM.getValue (a IN DOMAttr) RETURN VARCHAR2;
| 参数 | 用途 |
|---|---|
| a | 属性名称 |
# isNull Function
该函数用于确认XML文档是否为空,为空时返回TRUE,反之返回FALSE。
DBMS_XMLDOM.isNull(doc IN DOMDocument) RETURN BOOLEAN;
| 参数 | 用途 |
|---|---|
| doc | 指定需要查找的XML DOMDocument文档 |
# item Function
该函数用于获取指定位置的节点名称。
DBMS_XMLDOM.item(nl IN DOMNodeList, idx IN INTEGER) RETURN DOMNode;
| 参数 | 用途 |
|---|---|
| nl | 指定的DOMNodeList。如果输入的DOMNodeList为NULL,则函数返回NULL |
| idx | 指定的节点位置。 - 输入NULL时,返回第一个节点。 - 如果指定的位置超出DOMNodeList长度,则函数返回NULL。 |
# makeElement Function
该函数用于将指定节点转换为元素节点。
DBMS_XMLDOM.makeElement(n IN DOMNode) RETURN DOMElement;
| 参数 | 用途 |
|---|---|
| n | 节点名称 |
# makeNode Functions
这组函数用于将XML文档、文本、属性、元素转换为XML文档的节点对象。
DBMS_XMLDOM.makeNode(doc IN DOMDocument) RETURN DOMNode;
DBMS_XMLDOM.makeNode(t IN DOMText) RETURN DOMNode;
DBMS_XMLDOM.makeNode(a IN DOMAttr) RETURN DOMNode;
DBMS_XMLDOM.makeNode(elem IN DOMElement) RETURN DOMNode;
| 参数 | 用途 |
|---|---|
| doc | 指定XML DOMDocument文档 |
| t | 指定DOMText |
| a | 指定DOMAttr |
| elem | 指定DOMElement |
示例
DECLARE
doc DBMS_XMLDOM.DOMDocument;
book_element DBMS_XMLDOM.DOMElement;
new_node DBMS_XMLDOM.DOMNode;
BEGIN
doc := DBMS_XMLDOM.newDOMDocument();
book_element := DBMS_XMLDOM.createElement(doc, 'book');
-- 将元素附加到文档根节点
new_node := DBMS_XMLDOM.appendChild(DBMS_XMLDOM.makeNode(doc), DBMS_XMLDOM.makeNode(book_element));
END;
/
# newDomDocument Function
该组函数用于创建一个新的XML文档对象。
创建一个空的DOMDocument。
DBMS_XMLDOM.newDomDocument
RETURN DOMDOCUMENT;
根据输入的xmltype类型文件创建一个DOMDocument。
DBMS_XMLDOM.newDomDocument
(
xmldoc IN sys.xmltype)
RETURN DOMDOCUMENT;
根据输入的clob数据创建一个DOMDocument。
DBMS_XMLDOM.newDomDocument
(
c IN clob)
RETURN DOMDOCUMENT;
| 参数 | 用途 |
|---|---|
| xmldoc | 输入类型为XMLType的文件 |
| c | 输入格式为clob类型的数据 |
# setAttribute Procedures
该组存储过程用于为元素属性设置属性值。
DBMS_XMLDOM.setAttribute
(elem IN DOMElement,
name IN VARCHAR2,
newvalue IN VARCHAR2);
DBMS_XMLDOM.setAttribute
(elem IN DOMElement,
name IN VARCHAR2,
newvalue IN VARCHAR2,
ns IN VARCHAR2);
| 参数 | 用途 |
|---|---|
| elem | 指定DOMElement |
| Name | 指定属性名称 |
| newvalue | 配置属性值 |
| ns | 指定需要查找的元素节点所属命名空间 |
# setNodeValue Procedure
该函数用于设置节点值。
DBMS_XMLDOM.setNodeValue(n IN DOMNode, nodeValue IN VARCHAR2);
| 参数 | 用途 |
|---|---|
| n | 指定DOMNode |
| nodeValue | 配置节点值 |
# writeToBuffer Procedures
该组存储过程用于将XML文档对象全文或指定节点写入缓冲区。
DBMS_XMLDOM.writeToBuffer(n IN DOMNode, buffer IN OUT VARCHAR2);
DBMS_XMLDOM.writeToBuffer(doc IN DOMDocument, buffer IN OUT VARCHAR2);
| 参数 | 用途 |
|---|---|
| n | 指定DOMNode |
| doc | 待处理的DOMDocument对象 |
| buffer | 待写入的缓存区域 |
示例
DECLARE
doc DBMS_XMLDOM.DOMDocument;
buffer CLOB;
new_node DBMS_XMLDOM.DOMNode;
BEGIN
-- 创建 XML 文档
doc := DBMS_XMLDOM.newDOMDocument;
-- 创建根元素并附加内容
new_node :=
DBMS_XMLDOM.appendChild(
DBMS_XMLDOM.makeNode(doc),
DBMS_XMLDOM.makeNode(DBMS_XMLDOM.createElement(doc, 'Root'))
);
-- 将 XML 文档写入缓冲区
DBMS_XMLDOM.writeToBuffer(doc, buffer);
-- 输出缓冲区大小
DBMS_OUTPUT.PUT_LINE('Buffer Size: ' || DBMS_LOB.getLength(buffer) || ' bytes');
DBMS_XMLDOM.freeDocument(doc);
END;
/
--result
Buffer Size: 38 bytes
# 示例
创建一个空文档,在元素节点下,多次添加元素节点且key值一样。
DECLARE
doc DBms_xmldom.domdocument;
elem2 DBms_xmldom.domelement;
docnode DBms_XMLDOM.DOMNode;
buffer CLOB;
value VARCHAR(1000);
BEGIN
doc := DBms_xmldom.newDOMDocument('
<items>
<item id="1">Apple</item>
<item id="2">Banana</item>
<item id="3"></item>
</items>
');
FOR i IN 0..10 LOOP
elem2 := DBms_XMLDOM.CREATEELEMENT(doc, 'item');
DBms_XMLDOM.setattribute(elem2, 'id', '3');
docnode := DBms_XMLDOM.appendChild(xmldom.getFirstChild(DBms_XMLDOM.makeNode(doc)), DBms_XMLDOM.makeNode(elem2));
END LOOP;
DBms_xmldom.writetobuffer(doc, buffer);
dbms_output.put_line('buffer: ');
dbms_output.put_line(buffer);
xmldom.freedocument(doc);
END;
/
--result
buffer:
<?xml version=\"1.0\" encoding=\"UTF8\" standalone=\"no\"?>\n<items><item id=\"1\">Apple</item><item id=\"2\">Banana</item><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/><item id=\"3\"/></items>

