2017-07-06 44 views
0

示例XML如下:我想從XML中存儲爲clob的表中使用sql提取標記名稱。 (ORACLE)

<Root> 
... 
<XMLNSC> 
... 
<SOAP-ENV:Envelope> 
... 
<SOAP-ENV:Body> 
<typesNS0:getABCD xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/" xmlns:xalan="http://xml.apache.org/xslt"> 

最後的標籤typesNS0:getABCD要選擇

+0

你能寫出你想要提取的正確的xml和標籤嗎?我當然是 –

+0

。 – Ro0oBi

+0

我知道如何使用EXTRACVALUE命令選擇值,但我不知道如何選擇標記 – Ro0oBi

回答

0
select xmltype(a).extract('//typesNS0:getABCD','xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/"') 
from (
    select 
    '<Root xmlns:SOAP-ENV="http://a.b.org/"> 
    <XMLNSC /> 
    <SOAP-ENV:Envelope/> 
    <SOAP-ENV:Body/> 
    <typesNS0:getABCD xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/" xmlns:xalan="http://xml.apache.org/xslt">123</typesNS0:getABCD> 
    </Root>' a from dual 
) 
0

您可以在下面的腳本運行,如果你想獲得準確的標記值;

DECLARE 
vs_Xml VARCHAR2(32000):= '<Root xmlns:SOAP-ENV="http://a.b.org/"> 
<XMLNSC /> 
<SOAP-ENV:Envelope/> 
<SOAP-ENV:Body/> 
<typesNS0:getABCD xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/" xmlns:xalan="http://xml.apache.org/xslt">123</typesNS0:getABCD> 
</Root>'; 

vx_ParameterList XMLTYPE; 
vx_Parameter  XMLTYPE; 
vn_ParameterIndex NUMBER; 
vs_Key    VARCHAR2(64); 
vs_XPath   VARCHAR2(255); 
vs_Value   VARCHAR2(10000); 

BEGIN 
vx_ParameterList := xmltype(vs_Xml); 
vn_ParameterIndex := 1; 
vs_XPath := '/Root'; 

WHILE vx_ParameterList.existsNode(vs_XPath || '[' || vn_ParameterIndex || ']') = 1 LOOP 
vx_Parameter := vx_ParameterList.extract(vs_XPath || '[' || vn_ParameterIndex || ']'); 

vs_Value := vx_Parameter.extract('//typesNS0:getABCD/text()','xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/"').GetStringVal(); 
vn_ParameterIndex := vn_ParameterIndex + 1; 

dbms_output.put_line(vs_Value); 
END LOOP; 

END; 
相關問題