简体   繁体   English

从 Oracle SQL 中的 XML 节点中提取名称和值

[英]Extract Name and Value from XML Node in Oracle SQL

I am trying to extract the Values based on Name via Oracle SQL query from the XML returned by a SOAP web service response, however it's resulting in errors. I am trying to extract the Values based on Name via Oracle SQL query from the XML returned by a SOAP web service response, however it's resulting in errors. I could extract AdName , AdCat using this XMLTYPE method, but not the ones that's embedded further inside Results and AdSettings attributes.我可以使用这种XMLTYPE方法提取AdNameAdCat ,但不能提取进一步嵌入到ResultsAdSettings属性中的方法。 I must be wrong with the syntax I am using.我使用的语法一定是错误的。 Any help is appreciated.任何帮助表示赞赏。

SQL Query with XML Response: SQL 查询 XML 响应:

WITH xmltest (id, data_xml) AS ( 
SELECT 1, XMLTYPE('<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <ResponseHeader xmlns="https://www.google.com/apis/ads/v202005">
      <requestId>123456</requestId>
    </ResponseHeader>
  </soap:Header>
  <soap:Body>
    <getAdsResponse xmlns="https://www.google.com/apis/ads/v202005">
      <getAdsResult>
        <ResultReceived>1</ResultReceived>
        <AdName>Target Comm. Systems</AdName>
        <AdCat>COMMERCIAL</AdCat>
        <SessionID>654321</SessionID>
        <Results>
          <Result><Name>ADId</Name><Value>2372</Value></Result>
          <Result><Name>AdStatus</Name><Value>ACTIVE</Value></Result>
          <Result><Name>targetWindow</Name><Value>TOP</Value></Result>
        </Results>
        <AdSettings>
          <Setting><Name>fontFamily</Name><Value>DEFAULT</Value></Setting>
          <Setting><Name>fontSize</Name><Value>9</Value></Setting>
          <Setting><Name>adSenseEnabled</Name><Value>TRUE</Value></Setting>
          <Setting><Name>adType</Name><Value>TEXT_AND_IMAGE</Value></Setting>
        </AdSettings>
      </getAdsResult>
    </getAdsResponse>
  </soap:Body>
</soap:Envelope>') FROM SYS.DUAL
  )
  SELECT x.Ad_Name,
         x.Ad_Category,
         x.Ad_ID,
         x.Ad_Status,
         x.AdSense_Enabled,
         x.Ad_Type
  FROM   xmltest d,  
         XMLTABLE ( XMLNAMESPACES ( 'http://schemas.xmlsoap.org/soap/envelope/'  AS  "soap",
                                    'https://www.google.com/apis/ads/v202005'    AS  "AdsNs2" 
                                  ),
                    '/soap:Envelope/soap:Body/AdsNs2:getAdsResponse/AdsNs2:getAdsResult'
                    PASSING d.data_xml
                    COLUMNS Ad_Name          VARCHAR2(50)  PATH  'AdsNs2:AdName',
                            Ad_Category      VARCHAR2(50)  PATH  'AdsNs2:AdCat',
                            Ad_ID            VARCHAR2(50)  PATH  'AdsNs2/Results:Result[Name="ADId"]/Value',
                            Ad_Status        VARCHAR2(50)  PATH  'AdsNs2/Results:Result[Name="AdStatus"]/Value',
                            AdSense_Enabled  VARCHAR2(50)  PATH  'AdsNs2/Results:Result[Name="adSenseEnabled"]/Value',
                            Ad_Type          VARCHAR2(50)  PATH  'AdsNs2/Results:Result[Name="adType"]/Value'
                  ) x;

Error:错误:

ORA-19112: error raised during evaluation: 
XVM-01081: [XPST0081] Invalid prefix
1   declare namespace soap="http://schemas.xmlsoap.org/soap/envelope/";declare 
-                                                                                                                                               ^

19112. 00000 -  "error raised during evaluation: %s"
*Cause:    The error function was called during evaluation of the XQuery expression.
*Action:   Check the detailed error message for the possible causes.
Error at Line: 39 Column: 10

The last four columns XPath expressions were completely off.最后四列 XPath 表达式完全关闭。 Here is how to do it correctly.以下是如何正确执行此操作。

SQL SQL

WITH xmltest (id, data_xml) AS ( 
SELECT 1, XMLTYPE('<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <ResponseHeader xmlns="https://www.google.com/apis/ads/v202005">
      <requestId>123456</requestId>
    </ResponseHeader>
  </soap:Header>
  <soap:Body>
    <getAdsResponse xmlns="https://www.google.com/apis/ads/v202005">
      <getAdsResult>
        <ResultReceived>1</ResultReceived>
        <AdName>Target Comm. Systems</AdName>
        <AdCat>COMMERCIAL</AdCat>
        <SessionID>654321</SessionID>
        <Results>
          <Result><Name>ADId</Name><Value>2372</Value></Result>
          <Result><Name>AdStatus</Name><Value>ACTIVE</Value></Result>
          <Result><Name>targetWindow</Name><Value>TOP</Value></Result>
        </Results>
        <AdSettings>
          <Setting><Name>fontFamily</Name><Value>DEFAULT</Value></Setting>
          <Setting><Name>fontSize</Name><Value>9</Value></Setting>
          <Setting><Name>adSenseEnabled</Name><Value>TRUE</Value></Setting>
          <Setting><Name>adType</Name><Value>TEXT_AND_IMAGE</Value></Setting>
        </AdSettings>
      </getAdsResult>
    </getAdsResponse>
  </soap:Body>
</soap:Envelope>') FROM SYS.DUAL
  )
  SELECT x.Ad_Name,
         x.Ad_Category,
         x.Ad_ID,
         x.Ad_Status,
         x.AdSense_Enabled,
         x.Ad_Type
  FROM   xmltest d,  
         XMLTABLE ( XMLNAMESPACES ( 'http://schemas.xmlsoap.org/soap/envelope/'  AS  "soap",
                                    'https://www.google.com/apis/ads/v202005'    AS  "AdsNs2" 
                                  ),
                    '/soap:Envelope/soap:Body/AdsNs2:getAdsResponse/AdsNs2:getAdsResult'
                    PASSING d.data_xml
                    COLUMNS Ad_Name          VARCHAR2(50)  PATH  'AdsNs2:AdName',
                            Ad_Category      VARCHAR2(50)  PATH  'AdsNs2:AdCat',
                            Ad_ID            VARCHAR2(50)  PATH  'AdsNs2:Results/AdsNs2:Result[AdsNs2:Name="ADId"]/AdsNs2:Value',
                            Ad_Status        VARCHAR2(50)  PATH  'AdsNs2:Results/AdsNs2:Result[AdsNs2:Name="AdStatus"]/AdsNs2:Value',
                            AdSense_Enabled  VARCHAR2(50)  PATH  'AdsNs2:AdSettings/AdsNs2:Setting[AdsNs2:Name="adSenseEnabled"]/AdsNs2:Value',
                            Ad_Type          VARCHAR2(50)  PATH  'AdsNs2:AdSettings/AdsNs2:Setting[AdsNs2:Name="adType"]/AdsNs2:Value'
                  ) x;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM