2013-07-30 209 views
5

我有存儲在DB中表的clob列中的XML文件。在Oracle DBMS_XMLDOM包中獲取XML元素值

<?xml version="1.0" encoding="UTF-8"?> 
<document> 
    <row> 
    <organization>asdklfjas;kldfj;LASKJFAS</organization> 
    <phones>sjhdfhjaghjskfg</phones> 
    <persons>hkjg</persons> 
    </row>             
</document> 

我正在使用DBMS_XMLDOM包進行解析。

declare 
    v_clob clob; 
    v_doc dbms_xmldom.domdocument; 
begin 
    ... 
    v_doc := dbms_xmldom.newdomdocument(v_clob); 
    v_domelement := dbms_xmldom.getdocumentelement(v_doc); 
    ... 
end; 

我需要簡單地從某個元素中獲得價值,例如<persons>。我該怎麼做?

回答

1

我找到了我正在尋找:

... 
v_doc := dbms_xmldom.newdomdocument(v_clob); 
v_nodelist := dbms_xmldom.getelementsbytagname(v_doc, 'persons'); 
v_node := dbms_xmldom.getfirstchild(dbms_xmldom.item(v_nodelist, 0)); 
v_person := dbms_xmldom.getnodevalue(v_node); 
... 
3

也有使用XslProcessor功能一起使用XPath的選項:

DECLARE 
    v_Clob CLOB; 
    v_Doc XmlDom.DomDocument; 
    v_RootNode XmlDom.DomNode; 
    v_Value VARCHAR2(128); 
BEGIN 
    ... 

    v_Doc := XmlDom.NewDomDocument(v_Clob); 
    v_RootNode := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_Doc)); 
    v_Value := XmlDom.GetNodeValue(
    XslProcessor.SelectSingleNode(v_RootNode, '/document/row[1]/persons/text()')); 

    ... 
END; 
1

要獲得XML元素的值,你可以使用DBMS_XMLDOM或XslProcessor包。 參考我的回答here來構建CLOB列中的DBMS_XMLDOM.DOMDocument。然後使用下面的方法提取元素值。

FUNCTION Get_Node_Value_From_Doc(
    v_Doc   IN DBMS_XMLDOM.DomDocument) RETURN VARCHAR2 
IS 
    v_Clob CLOB; 
    v_RootNode DBMS_XMLDOM.DomNode; 
    v_Value VARCHAR2(2000); 
BEGIN  
    v_RootNode := DBMS_XMLDOM.MakeNode(XmlDom.GetDocumentElement(v_Doc)); 
    v_Value := DBMS_XMLDOM.GetNodeValue(XslProcessor.SelectSingleNode(v_RootNode, 
    '/soap:Envelope/soap:Body/GetLiveAnalysisIDSResponse[1]/AnalysisIDs[1]/guid[1]/text()' 
    ,'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="https://www.testkid.net/"')); 
    RETURN v_Value; 
END Get_Node_Value_From_Doc; 

提供正確的名稱空間在處理SOAP XML消息時很重要。