我正在尝试使用DBMS_XMLDOM从我的xml中获取文本值。 例如:
<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;
提前致谢。
此致 伊万
答案 0 :(得分: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;
答案 1 :(得分: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