首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从XMLTYPE读取元素

从XMLTYPE读取元素
EN

Stack Overflow用户
提问于 2017-05-24 11:53:51
回答 2查看 127关注 0票数 0

希望有人能帮忙。

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

这在这个XML上运行得很好:

代码语言:javascript
复制
<?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>

使用此代码:

代码语言:javascript
复制
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有问题。我需要检索这个标记的值:

代码语言:javascript
复制
<name>&amp;RESULT#</name>

我试过几件事,但就是找不到密码。

我在CLOB (l_result)中捕获的SOAP的结果。

代码语言:javascript
复制
<?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>&amp;EXT_HOSTNAME#</name>
               <value>sz4183</value>
            </items>
            <items>
               <name>&amp;EXT_SOAP_ID#</name>
               <value>sz4183</value>
            </items>
            <items>
               <name>&amp;EXT_SOAP_WF#</name>
               <value>JOBP.ADP.SOAP_TEST1</value>
            </items>
            <items>
               <name>&amp;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>

我玩过这个,但没有成功:

代码语言:javascript
复制
    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, '&amp;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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-24 12:59:11

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

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

代码语言:javascript
复制
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.

你可以在文档中阅读更多关于XMLQuery的信息。在本例中,我使用的XPath:

代码语言:javascript
复制
//items/name[text()=''&amp;RESULT#'']/../value/text()

查找文本值为所需字符串(以转义单引号表示)的items/name节点;然后使用..查找它的父节点(items)节点,然后在该items节点下查找values节点。并获取它的文本值。

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

顺便说一句,你也可以用第一个例子做同样的事情:

代码语言:javascript
复制
...
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.
票数 0
EN

Stack Overflow用户

发布于 2017-05-24 12:49:04

我发现密码有效。

代码语言:javascript
复制
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);

结果是:

代码语言:javascript
复制
name: &RESULT#
value : /dev;/u01;/etc/mnttab;/etc/dfs/sharetab;/dev/fd;/export;/rpool;/mnt/ora_dba

我仍然想找到的是如何搜索元素&RESULT#和属于这个元素的值。现在,我确实计算了元素(19表示名称,17表示值),只是为了检查代码。

干杯Wim

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44157687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档