[英]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
方法提取AdName
、 AdCat
,但不能提取进一步嵌入到Results
和AdSettings
属性中的方法。 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.