2016-09-21 4 views
1

OracleプロシージャでXMLデータのブール値を取得するために、私はXMLレスポンスを返しているオラクルからのSOAP Webサービスを呼び出しています:私はブール値をキャッチする必要がは次のようにどのように

<?xml version="1.0" encoding="utf-8"?> 
    <boolean xmlns="http://SOAPwebservice.com/WebServices/Methods"> 
    false 
    </boolean> 

ので、私はこのhow to use xmltable in oracle?を見つけましたが、私私の単純なブール応答、どのようなヒントでそれを行う方法はありませんか?

解決
+0

?あなたは、要素名の値を抽出するSQLクエリを希望? – OldProgrammer

+0

はい@OldProgrammer、webservice reponseはbooleanタグです。何か案が? –

答えて

1
WITH test_data AS 
    (SELECT xmltype('<boolean xmlns="http://SOAPwebservice.com/WebServices/Methods">false</boolean>') data 
    FROM dual 
) 
SELECT extractValue(data,'/boolean','xmlns="http://SOAPwebservice.com/WebServices/Methods"') 
FROM test_data 
0

、問題は=のxmlnsとあったが、「...」答え

FUNCTION XMLTEST (P_XML VARCHAR2) RETURN VARCHAR2 AS 
        V_FLAG VARCHAR2(4000); 
        V_XML1 VARCHAR2(4000); 
        V_XML2 VARCHAR2(4000); 
        V_XML VARCHAR2(4000);    
       BEGIN 
        V_XML1 := SUBSTR(P_XML,0,INSTR(P_XML,'xmlns')-1)||'>'; 
        V_XML2 := SUBSTR(P_XML,INSTR(P_XML,'/Methods">')+10); 
        V_XML := V_XML1||V_XML2; 

        SELECT P.boolean 
        INTO V_FLAG 
        FROM xmltable('/boolean' passing xmltype(V_XML) 
           columns boolean VARCHAR2(30) PATH 'text()') P; 

        RETURN V_FLAG;   

       END XMLTEST; 
1

ではなく名前空間を削除するには、XML文字列を変更しようとしているを取得するには、それを削除する必要があり、あなたは組み込むことができますそれをXMLクエリに追加します。あなたは、単一のノードを期待しているように、とエラーになります -

FUNCTION XMLTEST (P_XML VARCHAR2) RETURN VARCHAR2 AS 
    V_FLAG VARCHAR2(30); 
BEGIN 
    SELECT P.boolean 
    INTO V_FLAG 
    FROM xmltable(xmlnamespaces(default 'http://SOAPwebservice.com/WebServices/Methods'), 
      '/boolean' passing xmltype(P_XML) 
      columns boolean VARCHAR2(30) PATH '.') P; 

    RETURN V_FLAG; 
END XMLTEST; 

または:OldProgrammerはすでに非推奨extractValue()機能ではなく、あなたがについて尋ねたのXMLTableで同じことを行うことができますことを行う方法を示しました。 XMLTableのバージョンからの倍数はとにかくがある場合 - のXMLQuery:

SELECT XMLQuery(
     'declare default element namespace "http://SOAPwebservice.com/WebServices/Methods"; (: :) 
     /boolean/text()' 
     passing xmltype(P_XML) 
     returning content).getStringVal() 
    INTO V_FLAG 
    FROM dual; 

Read more about XMLTable and XMLQuery、およびそれらがどのように名前空間を扱います。

それは、XPathワイルドカードすることも可能です:抽出された値は、単なる文字列'false'以上のものです、あなたのフォーマットされたXML文字列で

SELECT XMLQuery('/*:boolean/text()' 
     passing xmltype(P_XML) 
     returning content).getStringVal() 
    INTO V_FLAG 
    FROM dual; 

を - それは、スペースや改行文字を先頭と末尾た、そしてどのあなたは可能性ストリップ必要ならば外に出す。あなたの実際のXMLが余分な空白を持たない<boolean>false</boolean>を持っているなら、それはもちろん必要ではなく、あなたのv_flagは5文字でなければなりません。

PL/SQLでこれを行う必要はありませんが、それはあなたが課している要件のようです。