【问题标题】:Extracting values from xml in Oracle PL/SQL在 Oracle PL/SQL 中从 xml 中提取值
【发布时间】:2013-07-29 11:48:17
【问题描述】:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <ShipmentTrackingResponse xmlns="http://ws.aramex.net/ShippingAPI/v1/">
   <Transaction xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Reference1>001</Reference1>
    <Reference2 i:nil="true"/>
    <Reference3 i:nil="true"/>
    <Reference4 i:nil="true"/>
    <Reference5 i:nil="true"/>
  </Transaction>
  <Notifications xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
  <HasErrors>false</HasErrors>
  <TrackingResults xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"         
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
  <NonExistingWaybills xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"  
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:string>XXXXXXXXXX</a:string>
  </NonExistingWaybills>
 </ShipmentTrackingResponse>
</s:Body>

我已使用以下查询来提取值,但如何提取 NonExistingWaybills?

 SELECT EXTRACTVALUE(l_resp_xml,
                    '//ShipmentTrackingResponse/Transaction/Reference1',
                    'xmlns="http://ws.aramex.net/ShippingAPI/v1/"') 
  INTO l_response_result 
   FROM dual;

  DBMS_OUTPUT.put_line ( 'Result> Reference1=' || l_response_result);

  SELECT EXTRACTVALUE(l_resp_xml,
                     '//ShipmentTrackingResponse/TrackingResults',
                     'xmlns="http://ws.aramex.net/ShippingAPI/v1/"') 
    INTO l_response_result 
    FROM dual;

  DBMS_OUTPUT.put_line ( 'Result> TrackingResults=' || l_response_result);

  SELECT EXTRACTVALUE(l_resp_xml,
                     '//ShipmentTrackingResponse/NonExistingWaybills',
                     'xmlns="http://ws.aramex.net/ShippingAPI/v1/"') 
    INTO l_response_result 
    FROM dual;

  DBMS_OUTPUT.put_line ( 'Result> NonExistingWaybills=' || l_response_result);

最后一个查询没有结果...

【问题讨论】:

  • 我试过了,它从 x 返回 XXXX 值 SELECT EXTRACTVALUE(xdata, '//ShipmentTrackingResponse/NonExistingWaybills/*', 'xmlns="ws.aramex.net/ShippingAPI/v1/"')
  • 是的,非常感谢..我解决了,见下文

标签: plsql xml-parsing extract-value


【解决方案1】:

它返回了结果...

SELECT EXTRACTVALUE(l_resp_xml
                  , '//ShipmentTrackingResponse/NonExistingWaybills/node()'
                  , 'xmlns="http://ws.aramex.net/ShippingAPI/v1/"') 
INTO l_response_result
FROM dual;
DBMS_OUTPUT.put_line ( 'Result> NonExistingWaybills=' || l_response_result);

【讨论】:

    【解决方案2】:

    这将返回相同的结果,但没有选择。我想这就是你要找的东西:

    l_response_result := l_resp_xml.extract(
        '//ShipmentTrackingResponse/NonExistingWaybills/node()'
    ).getstringval();
    

    【讨论】:

    • 来自审核队列:我可以请求您在您的答案周围添加更多上下文。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,它将帮助提问者和未来的读者。另请参阅Explaining entirely code-based answers。
    • 刚刚发现 here 这篇笔记:“在 Oracle Database 11g 第 2 版之前,一些用户使用 Oracle SQL 函数 extract 和 extractValue 来完成一些使用 SQL/XML 函数 XMLQuery 和XMLCast。SQL 函数 extract 和 extractValue 在 Oracle Database 11g 第 2 版中已弃用。"
    • 令人讨厌的是,extract.getstringval() 的行为与 extractvalue 略有不同,因为如果节点不存在,则 extract 返回“ORA-30625:不允许对 NULL SELF 参数进行方法调度”,而 extractvalue 返回空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2012-08-15
    相关资源
    最近更新 更多