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

how to get DOMTEXT with DBMS_XMLDOM on PL/SQL

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

提前致谢。

此致, 伊万

要获取文本节点的值,可以使用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;

走 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