You need to change the line
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(n);
to
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(n));
In the XML DOM, elements have no meaning to talk about. Element nodes contain text nodes as child elements, and it is these nodes that contain the desired values.
EDIT (in response to Tomalak's comment): I don't know any functions in DBMS_XMLDOM to get the combined value of all child text nodes of an element. If you need it, then you may need to use something like the following function:
CREATE OR REPLACE FUNCTION f_get_text_content ( p_node DBMS_XMLDOM.DOMNode ) RETURN VARCHAR2 AS l_children DBMS_XMLDOM.DOMNodeList; l_child DBMS_XMLDOM.DOMNode; l_text_content VARCHAR2(32767); l_length INTEGER; BEGIN l_children := DBMS_XMLDOM.GetChildNodes(p_node); l_length := DBMS_XMLDOM.GetLength(l_children); FOR i IN 0 .. l_length - 1 LOOP l_child := DBMS_XMLDOM.Item(l_children, i); IF DBMS_XMLDOM.GetNodeType(l_child) IN (DBMS_XMLDOM.TEXT_NODE, DBMS_XMLDOM.CDATA_SECTION_NODE) THEN l_text_content := l_text_content || DBMS_XMLDOM.GetNodeValue(l_child); END IF; END LOOP; RETURN l_text_content; END f_get_text_content; /
Luke woodward
source share