5

我有存储在 DB 表的 clob 列中的 XML 文件。

<?xml version="1.0" encoding="UTF-8"?>
<document>
  <row>
    <organization>asdklfjas;kldfj;LASKJFAS</organization>
    <phones>sjhdfhjaghjskfg</phones>
    <persons>hkjg</persons>
  </row>                                                  
</document>

我正在使用DBMS_XMLDOM包来解析它。

declare
  v_clob clob;
  v_doc dbms_xmldom.domdocument;
begin
  ...
  v_doc := dbms_xmldom.newdomdocument(v_clob);
  v_domelement := dbms_xmldom.getdocumentelement(v_doc);
  ...
end;

我只需要从某个元素中获取价值,例如<persons>. 我该怎么做?

4

3 回答 3

3

还可以选择将 XslProcessor 函数与 XPath 一起使用:

DECLARE
  v_Clob CLOB;
  v_Doc XmlDom.DomDocument;
  v_RootNode XmlDom.DomNode;
  v_Value VARCHAR2(128);
BEGIN
  ...

  v_Doc := XmlDom.NewDomDocument(v_Clob);
  v_RootNode := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_Doc));
  v_Value := XmlDom.GetNodeValue(
    XslProcessor.SelectSingleNode(v_RootNode, '/document/row[1]/persons/text()'));

  ...
END;
于 2013-10-25T08:30:50.890 回答
1

我找到了我正在搜索的内容:

...
v_doc := dbms_xmldom.newdomdocument(v_clob);
v_nodelist := dbms_xmldom.getelementsbytagname(v_doc, 'persons');
v_node := dbms_xmldom.getfirstchild(dbms_xmldom.item(v_nodelist, 0));
v_person := dbms_xmldom.getnodevalue(v_node);
...
于 2013-07-30T21:32:48.113 回答
1

要获取 XML 元素值,您可以使用 DBMS_XMLDOM 或 XslProcessor 包。请参阅我的回答以从 CLOB 列构造和 DBMS_XMLDOM.DOMDocument 。然后使用下面的方法提取元素值。

FUNCTION Get_Node_Value_From_Doc(
   v_Doc         IN DBMS_XMLDOM.DomDocument) RETURN VARCHAR2
IS
   v_Clob CLOB;
   v_RootNode DBMS_XMLDOM.DomNode;
   v_Value VARCHAR2(2000);
BEGIN       
   v_RootNode := DBMS_XMLDOM.MakeNode(XmlDom.GetDocumentElement(v_Doc));
   v_Value := DBMS_XMLDOM.GetNodeValue(XslProcessor.SelectSingleNode(v_RootNode,
   '/soap:Envelope/soap:Body/GetLiveAnalysisIDSResponse[1]/AnalysisIDs[1]/guid[1]/text()'
   ,'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="https://www.testkid.net/"'));  
   RETURN v_Value;
END Get_Node_Value_From_Doc;

在处理 SOAP XML 消息时,提供正确的名称空间很重要。

于 2016-06-22T07:19:01.743 回答