简体   繁体   中英

How to parse SOAP xml in sql server and show to table format

the webservice returned SOAP xml result, i would like to change the format to table in SQL server

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <MemberInformationResponse xmlns="http://www.ucr.com.hk">
            <MemberInformationResult>
                <Code>0</Code>
                <Description>Get Member Info Success </Description>
                <MemberCode>9997</MemberCode>
                <MemberCardCode>9997</MemberCardCode>
                <MemberTypeCode>GOLD2020</MemberTypeCode>
                <MemberTypeName1>Gold Member 2020</MemberTypeName1>
                <MemberTypeName2>Gold Member 2020</MemberTypeName2>
                <OldMemberTypeCode>SilverLINE</OldMemberTypeCode>
                <OldMemberTypeName1>Silver Member(LINE)</OldMemberTypeName1>
                <OldMemberTypeName2>Silver Member(LINE)</OldMemberTypeName2>
                <LoginID>9997</LoginID>
                <Name1>SilverLINE</Name1>
                <Name2>SilverLINE</Name2>
                <Sex>0</Sex>
                <Mobile>99900099</Mobile>
                <Email>khso@kabu.com.hk</Email>
                <PromotionAlert>1</PromotionAlert>
                <YearOfBirth>2001</YearOfBirth>
                <MonthOfBirth>01</MonthOfBirth>
                <JoinDate>2016/03/01</JoinDate>
                <WorkingDistrict />
                <LivingDistrict />
                <ActivationCode>4516</ActivationCode>
                <ReferralMemberCardCode>0151136201</ReferralMemberCardCode>
                <Enabled>0</Enabled>
                <Point>1005</Point>
                <Point1>1005</Point1>
                <Point2>0</Point2>
                <AccumulatedAmount>16376.8</AccumulatedAmount>
                <ExpiryDate>2020/08/31</ExpiryDate>
                <ExtendExpiryDate>2021/08/31</ExtendExpiryDate>
                <PointRemain>0</PointRemain>
                <PointExpiryDate>----/--/--</PointExpiryDate>
            </MemberInformationResult>
        </MemberInformationResponse>
    </soap:Body>
</soap:Envelope>

I tried below script, but no result return.

declare @xmldata xml
SET @xmldata = *put above soap xml*
declare @readdoc as INT

EXEC sp_xml_preparedocument @readdoc OUTPUT, @xmldata , '<root xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />'

select Code, MemberCode
from OPENXML(@readdoc,'soap:Envelope/soap:Body/MemberInformationResponse/MemberInformationResult')
with
( 
    Code int 'Code',
    MemberCode [varchar](50) 'MemberCode'
)

EXEC sp_xml_removedocument @readdoc
GO

How to get output like this: | Code | MemberCode | | ---- | ---------- | | 0 | 9997 |

please help to advise. Thanks.

Not an answer....

I believe it's something to do with MemberInformationResponse being in yet another namespaces

I think the newer way to do this is use the methods of the XML data type

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2005/ms190798(v=sql.90)?redirectedfrom=MSDN

Rather than sp_xml_preparedocument etc.

If you want to stick with sp_xml_preparedocument , I suggest you experiment with this. It produces an output and you can iteratively experiment with it.

declare @xmldata VARCHAR(8000)
SET @xmldata = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <MemberInformationResponse xmlns="http://www.ucr.com.hk">
            <MemberInformationResult>
                <Code>0</Code>
                <Description>Get Member Info Success </Description>
                <MemberCode>9997</MemberCode>
                <MemberCardCode>9997</MemberCardCode>
                <MemberTypeCode>GOLD2020</MemberTypeCode>
                <MemberTypeName1>Gold Member 2020</MemberTypeName1>
                <MemberTypeName2>Gold Member 2020</MemberTypeName2>
                <OldMemberTypeCode>SilverLINE</OldMemberTypeCode>
                <OldMemberTypeName1>Silver Member(LINE)</OldMemberTypeName1>
                <OldMemberTypeName2>Silver Member(LINE)</OldMemberTypeName2>
                <LoginID>9997</LoginID>
                <Name1>SilverLINE</Name1>
                <Name2>SilverLINE</Name2>
                <Sex>0</Sex>
                <Mobile>99900099</Mobile>
                <Email>khso@kabu.com.hk</Email>
                <PromotionAlert>1</PromotionAlert>
                <YearOfBirth>2001</YearOfBirth>
                <MonthOfBirth>01</MonthOfBirth>
                <JoinDate>2016/03/01</JoinDate>
                <WorkingDistrict />
                <LivingDistrict />
                <ActivationCode>4516</ActivationCode>
                <ReferralMemberCardCode>0151136201</ReferralMemberCardCode>
                <Enabled>0</Enabled>
                <Point>1005</Point>
                <Point1>1005</Point1>
                <Point2>0</Point2>
                <AccumulatedAmount>16376.8</AccumulatedAmount>
                <ExpiryDate>2020/08/31</ExpiryDate>
                <ExtendExpiryDate>2021/08/31</ExtendExpiryDate>
                <PointRemain>0</PointRemain>
                <PointExpiryDate>----/--/--</PointExpiryDate>
            </MemberInformationResult>
        </MemberInformationResponse>
    </soap:Body>
</soap:Envelope>
'


declare @readdoc as INT

EXEC sp_xml_preparedocument @readdoc OUTPUT, @xmldata, '<root xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />'

select *
from OPENXML(@readdoc,'/soap:Envelope/soap:Body')

EXEC sp_xml_removedocument @readdoc
GO

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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