2013-07-30 15 views
5

Mam plik XML, który jest przechowywany w kolumnie clob tabeli w DB.Uzyskaj wartość elementu XML w pakiecie Oracle DBMS_XMLDOM

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

Używam pakietu DBMS_XMLDOM do przeanalizowania go.

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; 

muszę po prostu uzyskać wartość z jakiegoś elementu, na przykład <persons>. Jak mogę to zrobić?

Odpowiedz

1

znalazłem to, czego szukałem:

... 
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

Istnieje również możliwość korzystania z funkcji XslProcessor wraz z 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

Aby uzyskać XML wartość elementu można użyć DBMS_XMLDOM lub XslProcessor pakiety. Zobacz moją odpowiedź: here do skonstruowania i DBMS_XMLDOM.DOMDocument z kolumny CLOB. Następnie użyj poniższej metody, aby wyodrębnić wartość elementu.

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; 

Zapewnienie prawidłowego obszaru nazw jest ważne w przypadku obsługi komunikatów XML SOAP.

Powiązane problemy