如何在PL / SQL上使用DBMS_XMLDOM获取DOMTEXT

时间:2016-02-16 17:45:06

标签: sql database plsql oracle11g xmldom

我正在尝试使用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; 

提前致谢。

此致 伊万

2 个答案:

答案 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