'Not able to parse XML
I need help parsing an XML variable into a table format as below. I am new to parsing looked up in google and was able to parse AccountId, Email, ProductName and ProductType but not able to parse nodes with in attribute like CustName, CreatedDate, billingCode
DECLARE @xmlvalue XML =
'<Request>
<AccountId>16000</AccountId>
<Email>[email protected]</Email>
<Attributes>
<Attribute><Name xmlns="http://testtarget.com/wsdl/myAPI">CustName</Name><Value xmlns="http://testtarget.com/wsdl/myAPI">TestName</Value></Attribute>
<Attribute><Name xmlns="http://testtarget.com/wsdl/myAPI">CreatedDate</Name><Value xmlns="http://testtarget.com/wsdl/myAPI">3/26/2022</Value></Attribute>
<Attribute><Name xmlns="http://testtarget.com/wsdl/myAPI">BillingCode</Name><Value xmlns="http://testtarget.com/wsdl/myAPI">testbiling</Value></Attribute>
</Attributes>
<ProductName>TestProduct</ProductName>
<ProductType>Recurring</ProductType>
</Request>'
Expected OUTPUT :
AccountId Email CustName CreatedDate BillingCode ProductName ProductType
1600 [email protected] TestName 03/26/2022 testbiling TestProduct Recurring
Below code is giving me what I wanted. Is there an easy approach?
SELECT req.req_col.value('AccountId[1]','INT') AS AccountId,
req.req_col.value('Email[1]','VARCHAR(100)') AS Email,
req.req_col.value('ProductName[1]','VARCHAR(100)') AS ProductName,
req.req_col.value('ProductType[1]','VARCHAR(100)') AS ProductType,
v.CustName,
v.CreatedDate,
v.BillingCode
FROM @xmlvalue.nodes('/Request') req(req_col)
CROSS APPLY ( SELECT *
FROM (SELECT req.req_col.value('Name[1]','VARCHAR(100)') AS Name,
req.req_col.value('Value[1]','VARCHAR(100)') AS Value
FROM @xmlvalue.nodes('/Request/Attributes/Attribute') req(req_col)
) tab1
PIVOT (
MAX(Value) FOR Name IN ( CustName, CreatedDate, BillingCode )) Tab2
) v
Solution 1:[1]
It is not necessary to use PIVOT for this, you can use filters in XPath expressions to select the various Attribute Name-Value element pairs, e.g.:
with xmlnamespaces (
'http://testtarget.com/wsdl/myAPI' as anything
)
select
request.value(N'(AccountId/text())[1]', N'nvarchar(50)') as AccountId,
request.value(N'(Email/text())[1]', N'nvarchar(50)') as Email,
request.value(N'(Attributes/Attribute[anything:Name/text()="CustName"]/anything:Value/text())[1]', N'nvarchar(50)') as CustName,
request.value(N'(Attributes/Attribute[anything:Name/text()="CreatedDate"]/anything:Value/text())[1]', N'nvarchar(50)') as CreatedDate,
request.value(N'(Attributes/Attribute[anything:Name/text()="BillingCode"]/anything:Value/text())[1]', N'nvarchar(50)') as BillingCode,
request.value(N'(ProductName/text())[1]', N'nvarchar(50)') as ProductName,
request.value(N'(ProductType/text())[1]', N'nvarchar(50)') as ProductType
from @xmlvalue.nodes('/Request') foo(request);
| AccountId | CustName | CreatedDate | BillingCode | ProductName | ProductType | |
|---|---|---|---|---|---|---|
| 16000 | [email protected] | TestName | 3/26/2022 | testbiling | TestProduct | Recurring |
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
