2016-02-16 1 views
0

Я пытаюсь получить текстовое значение из моего xml с помощью DBMS_XMLDOM. Например в:Как получить DOMTEXT с DBMS_XMLDOM на PL/SQL

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

Я хочу, чтобы получить "Model-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

 Смежные вопросы

  • Нет связанных вопросов^_^