Bạn cần thay đổi dòng
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(n);
đến
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(n));
Trong XML DOM, các phần tử không có bất kỳ 'giá trị' nào để nói đến. Các nút phần tử chứa các nút Văn bản dưới dạng con và chính các nút này chứa các giá trị bạn muốn.
CHỈNH SỬA (theo nhận xét của Tomalak):Tôi không biết bất kỳ chức năng nào trong DBMS_XMLDOM để lấy giá trị kết hợp của tất cả các nút văn bản con của một phần tử. Nếu đó là những gì bạn cần, thì bạn có thể cần sử dụng một cái gì đó như hàm sau:
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;
/