2017-05-24 3 views
0

누군가 도움을 주시기 바랍니다.XMLTYPE에서 요소를 읽으십시오.

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>&amp;RESULT#</name> 

내가 몇 가지를 시도했지만 바로 PROPPER 코드를 찾을 수 없습니다.

SOAP의 결과는 CLOB (l_result)에서 catch합니다.

<?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> 

나는이 함께 놀았지만 성공하지 :

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; 

모든 sugestions 환영합니다.

환호 빔

+0

'& 결과 번호'노드의 텍스트 값이 아닌 노드 이름입니다. 너는 실제로 무엇을 얻으려고 하는가? 당신이 참조하는'name' 노드의 값은 찾고자하는 문자열입니다, 그래서 당신은 이미 그것을 가지고 있습니다 .... 그래서'name' 노드와 일치하는'value' 노드를 원합니까? –

+0

Thx Alex, 이 값으로 NAME 요소 뒤에 오는 값을 찾고 있습니다. 아래의 게시물을 참조하십시오. 더 많은 테스트를 수행했습니다. – Wim

답변

0

난 당신이 각각의 name 텍스트를 테스트 items 이상의 노드를 반복하고, 당신이하고있는 일을 찾을 때 막을 수 생각하지만, 전혀 DOM을 산책하려고하지 것이다 에 관심이 - 그리고 그 items 노드의 value 텍스트를 사용하십시오.

그것은 비록 내장 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. 

당신은 read more about XMLQuery in the documentation을 할 수 있습니다. 이 경우 XPath는 내가 사용했습니다 :

//items/name[text()=''&amp;RESULT#'']/../value/text() 

누구의 텍스트 값 items/name 노드를 찾습니다

당신이 (탈출 작은 따옴표) 원하는 문자열입니다; 그런 다음 부모 노드 ( items)가 ..을 사용하는 것으로 확인되면 아래의 values 노드가 items 노드 인 것을 찾습니다. 그리고 텍스트 값을 가져옵니다.

(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. 
+0

안녕하세요 Alex, 는 onXML을 시작하는 방법을 모르기 때문에 일부 코드를 훑어 보았습니다. 그러나 실제로는 귀하의 것이 더 간단하고 간단합니다. Thx 너의 도움을 위해. 나는 이것을 사용할 것이다. 잘 작동합니다.) 건배 Wim – Wim

0

나는 코드가 작동하는 것을 발견했다.

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 

는 요소 & 결과 # 및이 요소에 속하는 값을 검색하는 방법입니다. 이제 코드를 확인하기 위해 요소 (19 개의 이름과 17 개의 값)를 계산했습니다.

환호 빔

+0

이 shoudl은 정말로 질문에 대한 수정이었습니다. –