首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PL/SQL上用DBMS_XMLDOM实现DOMTEXT

如何在PL/SQL上用DBMS_XMLDOM实现DOMTEXT
EN

Stack Overflow用户
提问于 2016-02-16 17:45:06
回答 2查看 1.6K关注 0票数 0

我试图用DBMS_XMLDOM从我的xml中获取文本值。例如:

代码语言:javascript
复制
<Vehicle>
    <Cars name ="Tesla">Model-S</Cars>
</Vehicle>

我想得到“型号-S”作为Varchar2。我似乎找不到像getTextNode/getTextValue这样的函数。从DomText中获取值的正确方法是什么?

到目前为止我得到了:

代码语言:javascript
复制
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; 

提前谢谢。

你好,伊凡

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-16 18:38:19

要获取文本节点的值,可以使用XMLDOM.GETNODEVALUE,但要使用该值,需要获得节点xmldom.getFirstChild(n)的第一个子节点。使用下面的块获取输出

代码语言:javascript
复制
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;
票数 3
EN

Stack Overflow用户

发布于 2016-02-16 18:38:44

在这里遍历DOM似乎过度了;您可以使用XQuery:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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   
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35439534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档