Проблема с анализом XML с несколькими пространствами имен в SQL - PullRequest
0 голосов
/ 15 октября 2018

У меня проблема с анализом информации из XML в SQL с двойным пространством имен.Посмотрите на этот код:

DECLARE @Handle AS INT; -- The handle of the XML data, passed to sp_xml_preparedocument
DECLARE @Xml AS NVARCHAR(1000); -- The XML document for this example


SET @Xml = N'
<SiBikNet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://www.ws.bik.pl/ws/ki/2v2/types">
 <BIK_REQUEST>
    <siBikNetResponse>
        <consentDate>2018-07-29</consentDate>
        <citizenshipStatus>citizen</citizenshipStatus>
        <nationality>PL</nationality>
        <pesel>123</pesel>
    </siBikNetResponse>
 </BIK_REQUEST>
</SiBikNet>';


EXEC sys.sp_xml_preparedocument @Handle OUTPUT , @Xml, N'<SiBikNet xmlns:t="https://www.ws.bik.pl/ws/ki/2v2/types"/>'; --Prepare a parsed document 

SELECT *
FROM
       OPENXML(@Handle,'/t:SiBikNet/t:BIK_REQUEST/t:siBikNetResponse', 2)
           WITH (   nationality NVARCHAR(10) 't:nationality',
                    pesel  NVARCHAR(10)      't:pesel '
                );

EXEC sys.sp_xml_removedocument @Handle;  

, который дает мне правильный вывод в виде таблицы с 2 столбцами.Но когда я добавлю одну строку с двойным пространством имен: тогда я не смогу разобрать эту информацию:

DECLARE @Handle AS INT; -- The handle of the XML data, passed to sp_xml_preparedocument
DECLARE @Xml AS NVARCHAR(1000); -- The XML document for this example


SET @Xml = N'
<SiBikNet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://www.ws.bik.pl/ws/ki/2v2/types">
 <BIK_REQUEST xmlns="">
    <siBikNetResponse>
        <consentDate>2018-07-29</consentDate>
        <citizenshipStatus>citizen</citizenshipStatus>
        <nationality>PL</nationality>
        <pesel>123</pesel>
    </siBikNetResponse>
 </BIK_REQUEST>
</SiBikNet>';


EXEC sys.sp_xml_preparedocument @Handle OUTPUT , @Xml, N'<SiBikNet xmlns:t="https://www.ws.bik.pl/ws/ki/2v2/types"/>'; --Prepare a parsed document 

SELECT *
FROM
       OPENXML(@Handle,'/t:SiBikNet/t:BIK_REQUEST/t:siBikNetResponse', 2)
           WITH (   nationality NVARCHAR(10) 't:nationality',
                    pesel  NVARCHAR(10)      't:pesel '
                );

EXEC sys.sp_xml_removedocument @Handle; 

Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 15 октября 2018

Когда я застреваю с анонимными пространствами имен или комбинациями пространств имен странного игрока, самый простой способ - просто использовать функцию XPath local-name().Как это:

DECLARE @Handle AS INT; -- The handle of the XML data, passed to sp_xml_preparedocument
DECLARE @Xml AS NVARCHAR(1000); -- The XML document for this example


SET @Xml = N'
<SiBikNet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://www.ws.bik.pl/ws/ki/2v2/types">
 <BIK_REQUEST xmlns="">
    <siBikNetResponse>
        <consentDate>2018-07-29</consentDate>
        <citizenshipStatus>citizen</citizenshipStatus>
        <nationality>PL</nationality>
        <pesel>98070902702</pesel>
    </siBikNetResponse>
 </BIK_REQUEST>
</SiBikNet>';


EXEC sys.sp_xml_preparedocument @Handle OUTPUT , @Xml, N'<SiBikNet xmlns:t="https://www.ws.bik.pl/ws/ki/2v2/types"/>'; --Prepare a parsed document 

SELECT *
FROM
       OPENXML(@Handle,'/*[local-name()="SiBikNet"]/*[local-name()="BIK_REQUEST"]/*[local-name()="siBikNetResponse"]', 2)
           WITH (   nationality NVARCHAR(10) ,--'t:nationality',
                    pesel  NVARCHAR(10)      --'t:pesel '
                );

EXEC sys.sp_xml_removedocument @Handle; 
...