2016-02-16 23 views
0

我試圖從我的xml和DBMS_XMLDOM中獲取文本值。 例如在:如何在PL/SQL上使用DBMS_XMLDOM獲取DOMTEXT

<Vehicle> 
    <Cars name ="Tesla">Model-S</Cars> 
</Vehicle> 

我想獲得 「模範-S」 爲VARCHAR2。 看來,我無法找到任何像getTextNode/getTextValue這樣的函數。 從DomText獲取值的正確方法是什麼?

到目前爲止我有:提前

set serveroutput on size 1000000; 
DECLARE  
    xmlDomElement   xmldom.DOMElement; 
    xmlDomDokument  xmldom.DOMDocument; 
    v_xml clob; 
BEGIN   
    v_xml := 
    '<Vehicle> 
     <Car> 
     <Tesla>Model-X</Tesla> 
     </Car> 
    </Vehicle>'; 

    xmlDomDokument := dbms_xmldom.newDomDocument(v_xml) ; 
    xmlDomElement := dbms_xmldom.getdocumentelement(xmlDomDokument); 
    xmlDomNode := dbms_xmldom.makeNode(xmlDomElement); 
    dbms_output.put_line('Print node Vehicle : ' || dbms_xmldom.getnodename(xmlDomNode)); 

    -- Question: is there something like "dbms_xmldom.getTextValue"? 

end; 

感謝。

問候, 伊萬

回答

3

對於獲取文本節點的值,你可以使用XMLDOM.GETNODEVALUE。但要使用它,您需要獲取節點xmldom.getFirstChild(n)的第一個子節點。使用下面的塊得到你的輸出

DECLARE  
    xmlDomElement   xmldom.DOMElement; 
    xmlDomDokument  xmldom.DOMDocument; 
    xmlDomNode   xmldom.DOMNode; 
    lv_domnodelist1  dbms_xmldom.DomNodeList; 
    lv_domnodelist2  dbms_xmldom.DomNodeList; 
    v_xml clob; 
BEGIN   
    v_xml := 
    '<Vehicle> 
     <Car> 
     <Tesla>Model-X</Tesla> 
     </Car> 
    </Vehicle>'; 

    xmlDomDokument := dbms_xmldom.newDomDocument(v_xml) ; 
    xmlDomElement := dbms_xmldom.getdocumentelement(xmlDomDokument); 
    xmlDomNode := dbms_xmldom.makeNode(xmlDomElement); 
    lv_domnodelist1 := DBMS_XMLDOM.GETCHILDNODES(xmlDomNode); 

    For i in 0..dbms_xmldom.getLength(lv_domnodelist1) - 1 loop 
    xmlDomNode := DBMS_XMLDOM.ITEM(lv_domnodelist1,i); 
    lv_domnodelist2 := DBMS_XMLDOM.GETCHILDNODES(xmlDomNode); 
    FOR J in 0..dbms_xmldom.getLength(lv_domnodelist2) - 1 loop 
     xmlDomNode := DBMS_XMLDOM.ITEM(lv_domnodelist2,J); 
     dbms_output.put_line('Print node Name : ' || dbms_xmldom.getnodename(xmlDomNode)); 
     xmlDomNode := DBMS_XMLDOM.getFirstChild(xmlDomNode); 
     dbms_output.put_line('Print node Value : ' || dbms_xmldom.getnodevalue(xmlDomNode)); 
    end loop; 
    end loop; 
end; 
+0

請註明,如果這對你說過 –

2

走DOM看起來像是在這裏矯枉過正;你可以使用一個XQuery:

select XMLQuery('/Vehicle/Car/Tesla/text()' 
    passing XMLType('<Vehicle> 
     <Car> 
     <Tesla>Model-X</Tesla> 
     </Car> 
    </Vehicle>') 
    returning content) as model 
from dual; 

MODEL    
------------------ 
Model-X 

如果您需要了解更多信息,你可以得到更多的領域;並與多個節點可以使用XMLTable可以代替:

select * 
from XMLTable('/Vehicle/Car' 
    passing XMLType('<Vehicle> 
     <Car> 
     <Tesla>Model-X</Tesla> 
     </Car> 
    </Vehicle>') 
    columns vehicle_type varchar2(10) path 'local-name(.)', 
    vehicle_make varchar2(10) path 'local-name(./*)', 
    vehicle_model varchar2(10) path '*' 
); 

VEHICLE_TY VEHICLE_MA VEHICLE_MO 
---------- ---------- ---------- 
Car  Tesla  Model-X 
+0

使用XMLDOM是用於解析XML文檔,其元素名稱或結構是不知道是非常有用的。編寫xmldom代碼可能很乏味,但一旦創建,它將對解析整個文檔非常有幫助。 –

+2

@DineshV - 仍然看起來像這裏過度殺傷的那樣* 8-)當然,這個例子可能會大大簡化。 –

+0

@AlexPoole感謝您的展示。這是一種不同的方法。但也確定了正確的答案。 – Ivancodescratch