Как проанализировать SOAP XML в SQL Server и показать как данные таблицы - PullRequest
0 голосов
/ 14 мая 2019

Привет, у меня есть образцы данных в SOAP XML

DECLARE @xml XML = '<soapenv:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <ns0:Context xmlns:ns0="http://service.PUBG.com/entity/message/2007/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <messageId>N455D</messageId>
        <refToMessageId>142323</refToMessageId>
        <Timestamp>2018-08-08T23:00:11.282Z</Timestamp>
        <applicationId>PUBG</applicationId>
        <hostName>UNKNOWN</hostName>
    </ns0:Context>
</soap:Header>
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <ns2:searchResponseResponse xmlns:ns2="http://service.PubG.com/provider/gpow/bankLookup/PubGLookUpService/2013/" xmlns:ns4="http://service.PubG.com/provider/gpow/bankLookup/PubGLookUpService/2015/">
        <ns4:PubGDetails>
            <ns4:Name>PUBG Roll</ns4:Name>
        </ns4:PubGDetails>
        <ns4:PubGCode>xxxxxxx</ns4:PubGCode>
        <ns4:countryCode>US</ns4:countryCode>
        <ns4:address>
            <ns4:physicalAddress1>XXX PARK AVENUE</ns4:physicalAddress1>
        </ns4:address>
        <ns4:zipCode>123456</ns4:zipCode>
        <ns4:countryName>USA</ns4:countryName>
        <ns4:parentPubGCode>0</ns4:parentPubGCode>
        <ns4:modificationInd>A</ns4:modificationInd>
        <ns4:modificationDate>2017-05-02</ns4:modificationDate>
    </ns2:searchResponseResponse>
</soap:Body>

';

Я написал такой код, чтобы получить в формате таблицы:

;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS soap,
    'http://service.PubG.com/provider/gpow/bankLookup/PubGLookUpService/2013/' AS ns2,
    'http://service.PubG.com/provider/gpow/bankLookup/PubGLookUpService/2015/' AS ns4,
    'http://service.PUBG.com/entity/message/2007/' as ns0), rs AS
(
   SELECT col.value('(soap:Header/ns0:Context/messageId)[1]','VARCHAR(20)') AS messageId
   , col.value('(soap:Header/ns0:Context/refToMessageId)[1]','VARCHAR(20)') AS refToMessageId
   , col.value('(soap:Header/ns0:Context/Timestamp)[1]','DATE') AS [Timestamp]
   , col.value('(soap:Header/ns0:Context/applicationId)[1]','VARCHAR(20)') AS applicationId
   , col.value('(soap:Header/ns0:Context/hostName)[1]','VARCHAR(20)') AS hostName
   , col.value('(soap:Body/ns2:searchResponseResponse/ns4:PubGDetails/ns4:Name)[1]','VARCHAR(20)') AS PubGDetails
   , col.value('(soap:Body/ns2:searchResponseResponse/ns4:PubGCode)[1]','VARCHAR(20)') AS PubGCode
   , col.value('(soap:Body/ns2:searchResponseResponse/ns4:countryCode)[1]','VARCHAR(20)') AS countryCode
   , col.value('(soap:Body/ns2:searchResponseResponse/ns4:address/ns4:physicalAddress1)[1]','VARCHAR(20)') AS [Address]
   , col.value('(soap:Body/ns2:searchResponseResponse/ns4:zipCode)[1]','VARCHAR(20)') AS zipCode
   , col.value('(soap:Body/ns2:searchResponseResponse/ns4:countryName)[1]','VARCHAR(20)') AS countryName
   , col.value('(soap:Body/ns2:searchResponseResponse/ns4:parentPubGCode)[1]','VARCHAR(20)') AS parentPubGCode
   , col.value('(soap:Body/ns2:searchResponseResponse/ns4:modificationInd)[1]','VARCHAR(20)') AS modificationInd
   , col.value('(soap:Body/ns2:searchResponseResponse/ns4:modificationDate)[1]','DATE') AS modificationDate
   FROM @xml.nodes('/soap:Envelope') AS tab(col)
)
SELECT * FROM rs;

Iполучаю ошибку, как это:

Msg 9455, Level 16, State 1, Line 1
XML parsing: line 4, character 2, illegal qualified name character

Как получить вывод, как это:

messageId   refToMessageId  Timestamp   applicationId   hostName    PubGDetails PubGCode    countryCode address zipCode countryName parentPubGCode  modificationInd modificationDate
N455D        142323         8/8/2018      PUBG          UNKNOWN      PUBG Roll        xxxxxxxxx   us       XXX     PARK AVENUE           123456      USA    0   A   5/2/2017
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...