希望有人能帮忙。
在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>使用此代码:
declare
v_doc DBMS_XMLDOM.DOMDocument;
v_Value VARCHAR2 (2000);
v_node DBMS_XMLDOM.DOMNode;
v_nodelist DBMS_XMLDOM.DOMNodelist;
begin
... XML result from soap call catched in CLOB => l_result
v_doc := DBMS_XMLDOM.newdomdocument (l_result);
v_nodelist := DBMS_XMLDOM.getelementsbytagname (v_doc, 'runID');
v_node := DBMS_XMLDOM.getfirstchild (DBMS_XMLDOM.item (v_nodelist, 0));
v_value := DBMS_XMLDOM.getnodevalue (v_node);
DBMS_OUTPUT.put_line ('value a: ' || v_Value);
value a: 1120864但是,我确实对以下XML有问题。我需要检索这个标记的值:
<name>&RESULT#</name>我试过几件事,但就是找不到密码。
我在CLOB (l_result)中捕获的SOAP的结果。
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getTaskDetailsResponse xmlns:ns2="http://www.uc4.com/uc4/">
<groups>
<name>General</name>
<label>SCRI.ADP.SOAP.TEST (1120864)</label>
<items>
<name>Object name</name>
<value>SCRI.ADP.SOAP.TEST</value>
</items>
<items>
<name>Queue</name>
<value>CLIENT_QUEUE</value>
</items>
<items>
<name>Version</name>
<value>6</value>
</items>
<items>
<name>RunID</name>
<value>1120864</value>
</items>
<items>
<name>Activator</name>
<value>1115216</value>
</items>
<items>
<name>User</name>
<value>ADP_SOAP/ADP</value>
</items>
<items>
<name>Activation</name>
<value>2017-05-24T13:38:44</value>
</items>
<items>
<name>Start</name>
<value>2017-05-24T13:38:45</value>
</items>
<items>
<name>End</name>
<value>2017-05-24T13:38:45</value>
</items>
<items>
<name>Runtime</name>
<value>0:00:00</value>
</items>
<items>
<name>Status</name>
<value>ENDED_OK - ended normally</value>
</items>
<items>
<name>Return code</name>
<value>0</value>
</items>
<items>
<name>Event ID</name>
<value>1120864</value>
</items>
<items>
<name>Enable Rollback</name>
<value>No</value>
</items>
</groups>
<groups>
<name>Object variables</name>
<label>SCRI.ADP.SOAP.TEST (1120864)</label>
<items>
<name>&EXT_HOSTNAME#</name>
<value>sz4183</value>
</items>
<items>
<name>&EXT_SOAP_ID#</name>
<value>sz4183</value>
</items>
<items>
<name>&EXT_SOAP_WF#</name>
<value>JOBP.ADP.SOAP_TEST1</value>
</items>
<items>
<name>&RESULT#</name>
<value>/dev;/u01;/etc/mnttab;/etc/dfs/sharetab;/dev/fd;/export;/rpool;/mnt/ora_dba</value>
</items>
</groups>
</ns2:getTaskDetailsResponse>
</S:Body>
</S:Envelope>我玩过这个,但没有成功:
declare
v_doc DBMS_XMLDOM.DOMDocument;
v_Value VARCHAR2 (2000);
v_node DBMS_XMLDOM.DOMNode;
v_nodelist DBMS_XMLDOM.DOMNodelist;
begin
... XML result from soap call catched in CLOB => l_result
v_doc := DBMS_XMLDOM.newdomdocument (l_result);
v_nodelist := DBMS_XMLDOM.getelementsbytagname (v_doc, '&RESULT#');
v_node := DBMS_XMLDOM.getfirstchild (DBMS_XMLDOM.item (v_nodelist, 0));
v_value := DBMS_XMLDOM.getnodevalue (v_node);
DBMS_OUTPUT.put_line ('value: ' || v_Value);
end;欢迎所有的建议。
干杯Wim
发布于 2017-05-24 12:59:11
我根本不会尝试遍历DOM,尽管我认为您可以在items节点上迭代,在每个节点中测试name文本,并在找到感兴趣的节点时停止-然后使用items节点的value文本。
不过,使用内置XML处理更容易:
declare
l_result clob := '... your SOAP response ...';
v_Value VARCHAR2 (2000);
begin
select xmlquery('//items/name[text()=''&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.你可以在文档中阅读更多关于XMLQuery的信息。在本例中,我使用的XPath:
//items/name[text()=''&RESULT#'']/../value/text()查找文本值为所需字符串(以转义单引号表示)的items/name节点;然后使用..查找它的父节点(items)节点,然后在该items节点下查找values节点。并获取它的文本值。
(最好给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.发布于 2017-05-24 12:49:04
我发现密码有效。
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
https://stackoverflow.com/questions/44157687
复制相似问题