2015-10-15 61 views
0

我試圖從xmltype文檔中提取xml。如何在xml中提取xml在Oracle中

DECLARE 
    xmlData   XMLType; 
    sDocumentId  VARCHAR2(100); 
    sFormat   VARCHAR2(100); 
    cData   CLOB; 
BEGIN 
    xmlData := XMLType('<main> 
         <document_id>1234567</document_id> 
         <format>E66</format> 
         <data><Fname>ABCD</Fname><Lname>EFGD</Lname></data> 
        </main>'); 

    SELECT ExtractValue(xmlData, '/main/document_id/text()'), 
     ExtractValue(xmlData, '/main/format/text()'), 
     ExtractValue(xmlData, '/main/data/text()') 
    INTO sDocumentId, 
     sFormat, 
     cData 
    FROM (SELECT xmlData FROM DUAL); 

    dbms_output.put_line(sDocumentId); 
    dbms_output.put_line(sFormat); 
    dbms_output.put_line(cData); 
END; 

如何得到的輸出是這樣的:

  • DocumentId = 1234567
  • sFormat = E66
  • CDATA = <Fname>ABCD</Fname><Lname>EFGD</Lname>
+0

xmlData.Extract( '/主/數據/文本()')getStringVal()讓你' ABCD EFGD '接近,但不夠緊密;) – booyaa

+0

想出了這確實得到XML片段:'提取物(XMLDATA, '/主/數據/節點()')getStringVal()' – booyaa

回答

1

你可以這樣說:

SELECT EXTRACTVALUE(xmlData, '/main/document_id/text()'), 
    EXTRACTVALUE(xmlData, '/main/format/text()'), 
    EXTRACT(xmlData, '/main/data').GetClobVal() 
INTO sDocumentId, 
    sFormat, 
    cData 
FROM (SELECT xmlData FROM DUAL) t; 

請注意,EXTRACTVALUEEXTRACT已被棄用。但是,我沒使用XMLTABLE,但是這可能是一個起點:

SELECT * 
INTO sDocumentId, 
    sFormat, 
    cData 
FROM XMLTABLE('/main' PASSING xmlData COLUMNS 
    sDocumentId VARCHAR2(100) PATH 'document_id/text()', 
    sFormat VARCHAR2(100) PATH 'format/text()', 
    cData VARCHAR2(1000) PATH 'data/text()'); 
+0

謝謝!工作 – Prateik

+0

在這裏,我們如何獲得'數據'的clob數據?正如我想用GetClobVal()來獲取它。 – Prateik

1

使用下面的代碼。

DECLARE 
xmlData   XMLType; 
sDocumentId  VARCHAR2(100); 
sFormat   VARCHAR2(100); 
cData   Clob; 

BEGIN 

xmlData := XMLType('<main> 
       <document_id>1234567</document_id> 
       <format>E66</format> 
       <data><Fname>ABCD</Fname><Lname>EFGD</Lname></data> 
      </main>'); 


SELECT ExtractValue(xmlData, '/main/document_id/text()'), 
     ExtractValue(xmlData, '/main/format/text()'), 
     EXTRACT(xmlData,'/main/data').getClobVal() 
INTO sDocumentId, 
     sFormat, 
     cData 
FROM (SELECT xmlData FROM DUAL); 


dbms_output.put_line(sDocumentId); 
dbms_output.put_line(sFormat); 
dbms_output.put_line(cData); 

END; 

輸出將被

1234567 
E66 
<data><Fname>ABCD</Fname><Lname>EFGD</Lname></data> 
+0

使用提取物。函數來提取xml值。並且getClobVal()獲取clob變量的值。 –

+0

謝謝chaitanya – Prateik