我试图用DBMS_XMLDOM从我的xml中获取文本值。例如:
<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; 提前谢谢。
你好,伊凡
发布于 2016-02-16 18:38:19
要获取文本节点的值,可以使用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;发布于 2016-02-16 18:38:44
在这里遍历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 https://stackoverflow.com/questions/35439534
复制相似问题