获取 Oracle DBMS_XMLDOM 包中的 XML 元素值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17949943/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 01:49:47  来源:igfitidea点击:

Get XML element value in Oracle DBMS_XMLDOM package

oraclexml-parsingoracle11g

提问by sergdenisov

I have XML file that's stored in the clob column of the table in DB.

我有一个 XML 文件,它存储在 DB 表的 clob 列中。

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

I'm using DBMS_XMLDOMpackage for parse it.

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

I need simply to get value from some element, for example <persons>. How can I do it?

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

采纳答案by sergdenisov

I found what I was searching:

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

...
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);
...

回答by blerontin

There is also the option to use XslProcessor functions together with XPath:

还可以选择将 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;

回答by S.Roshanth

To get XML Element value you can use either DBMS_XMLDOM or XslProcessor packages. Refer to my answer hereto construct and DBMS_XMLDOM.DOMDocument from CLOB column. Then use the below method to extract element value.

要获取 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;

Providing correct namespace is important when dealing with SOAP XML messages.

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