2017-05-24 12 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)で捕捉されます。

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

'&のRESULT#'ノードのテキスト値ではなく、ノード名です。あなたは実際に何を得ようとしていますか?あなたが参照している 'name'ノードの値はあなたが探している文字列なので、既にそれを持っています....その' name'ノードに一致する 'value'ノードが必要ですか? –

+0

Thx Alex、 私はこの値を持つ要素NAMEの後の値を探しています。 以下の記事を参照してください。もう少しテストしました – Wim

答えて

0

私は私はあなたがitems以上のノードを繰り返すことができたとしても、それぞれ1でnameテキストをテストし、すべての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

こんにちは、アレックス、 は、どのようにonXMLを開始するかわからなかったので、いくつかのコードを探そうとしました。 あなたのものは実際にはそれほど単純ではありません。 あなたの助けにThx。私はこれを使用します。 うまく動作します;) 乾杯 – 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 

私はまだ見つけようとしているどのような要素& RESULT#と、この要素に属する値を検索する方法です。 今、コードをチェックするために、要素(19は名前、17は値)を数えました。

歓声ヴィム

+0

このshoudlは本当にあなたの質問に編集されていますが、答えはありません。 –

関連する問題