从XMLTYPE读取元素

从XMLTYPE读取元素,xml,soap,oracle12c,Xml,Soap,Oracle12c,希望有人能帮忙 在PLSQL中,我执行一个soap调用,并从soap接收XML结果。 我需要检索一个元素值 这在这个XML上工作得很好: <?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:executeObjectResponse xmlns:ns2="

希望有人能帮忙

在PLSQL中,我执行一个soap调用,并从soap接收XML结果。 我需要检索一个元素值

这在这个XML上工作得很好:

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:executeObjectResponse xmlns:ns2="http://www.uc4.com/uc4/">
         <runID>1120864</runID>
      </ns2:executeObjectResponse>
   </S:Body>
</S:Envelope>
但是,我确实对以下XML有问题。 我需要检索此标记的值:

<name>&amp;RESULT#</name>
欢迎所有建议

干杯
Wim

我发现代码是有效的

dbms_xmldom.freeDocument(v_doc);
      v_doc := DBMS_XMLDOM.newdomdocument (l_result);
      v_nodelist := DBMS_XMLDOM.getelementsbytagname (v_doc, 'name');
      v_node := DBMS_XMLDOM.getfirstchild (DBMS_XMLDOM.item (v_nodelist, 19));
      v_value := DBMS_XMLDOM.getnodevalue (v_node);
       DBMS_OUTPUT.put_line ('name: ' || v_Value);
       v_nodelist := DBMS_XMLDOM.getelementsbytagname (v_doc, 'value');
      v_node := DBMS_XMLDOM.getfirstchild (DBMS_XMLDOM.item (v_nodelist, 17));
      v_value := DBMS_XMLDOM.getnodevalue (v_node);
       DBMS_OUTPUT.put_line ('value : ' || v_Value);
结果是:

name: &RESULT#
value : /dev;/u01;/etc/mnttab;/etc/dfs/sharetab;/dev/fd;/export;/rpool;/mnt/ora_dba
我仍然试图找到的是如何搜索元素&RESULT#以及属于该元素的值。 现在我确实计算了元素(19表示名称,17表示值),只是为了检查代码


干杯Wim

我根本不会尝试遍历DOM,尽管我认为您可以迭代
节点,测试每个节点中的
名称
文本,并在找到感兴趣的文本时停止,然后使用该
节点的
文本

不过,使用内置的XML处理更容易:

declare
    l_result clob := '... your SOAP response ...';
    v_Value VARCHAR2 (2000);
begin
    select xmlquery('//items/name[text()=''&amp;RESULT#'']/../value/text()'
      passing xmltype(l_result)
      returning content).getstringval()
    into v_Value
    from dual;
    DBMS_OUTPUT.put_line ('value: ' || v_Value);
end;
/

value: /dev;/u01;/etc/mnttab;/etc/dfs/sharetab;/dev/fd;/export;/rpool;/mnt/ora_dba

PL/SQL procedure successfully completed.
你可以。在本例中,我使用了XPath:

//items/name[text()=''&amp;RESULT#'']/../value/text()
查找文本值为所需字符串的
items/name
节点(在转义单引号中);然后使用
查找它的父节点(
),然后在该
节点下查找
节点。并获取其文本值

(最好给出
/items
节点的完整路径,并包含所有名称空间信息,但您可以将其添加到中;使用
//items
会忽略上面的结构)

顺便说一句,您也可以对第一个示例执行相同的操作:

...
begin
    select xmlquery('//runID/text()'
      passing xmltype(l_result)
      returning content).getstringval()
    into v_Value
    from dual;
    DBMS_OUTPUT.put_line ('value a: ' || v_Value);
end;
/

value a: 1120864

PL/SQL procedure successfully completed.

&;结果#
是节点文本值,而不是节点名称。你到底想得到什么?您引用的
name
节点的值是您正在查找的字符串,因此您已经有了该字符串。。。。因此,您需要该
名称
节点的匹配
节点?Thx Alex,我正在查找元素名称后面的值和该值。见下文。。这应该是对你的问题的编辑,而不是回答。嗨,Alex,根本不知道如何从XML开始,所以谷歌搜索了一些代码。然而,你的方法确实不那么简单。谢谢你的帮助。。我会用这个。很好;)干杯
declare
    l_result clob := '... your SOAP response ...';
    v_Value VARCHAR2 (2000);
begin
    select xmlquery('//items/name[text()=''&amp;RESULT#'']/../value/text()'
      passing xmltype(l_result)
      returning content).getstringval()
    into v_Value
    from dual;
    DBMS_OUTPUT.put_line ('value: ' || v_Value);
end;
/

value: /dev;/u01;/etc/mnttab;/etc/dfs/sharetab;/dev/fd;/export;/rpool;/mnt/ora_dba

PL/SQL procedure successfully completed.
//items/name[text()=''&amp;RESULT#'']/../value/text()
...
begin
    select xmlquery('//runID/text()'
      passing xmltype(l_result)
      returning content).getstringval()
    into v_Value
    from dual;
    DBMS_OUTPUT.put_line ('value a: ' || v_Value);
end;
/

value a: 1120864

PL/SQL procedure successfully completed.