Разбор XML с пространствами имен в TSQL - дочерние элементы - PullRequest
0 голосов
/ 31 мая 2018

У меня есть xml, как показано ниже, мне удалось получить одну из переменных физического адреса за раз, но я хочу получить все существующие записи в дочерней заметке, если она существует, в противном случае у меня возникают проблемы с дублированием.

Желательным результатом было бы получение всех дочерних записей в столбце для каждой записи, поэтому, если бы было 5 адресов, у меня было бы 5 записей с разной частью адреса в каждой строке

Я ценю вашу помощь.

Спасибо

Используемый XML:

 `<PostData xmlns="mypath">
 <data>
     <Studentebo:CurrentEBO xmlns:Studentebo="MMMMMMM">
     <Studentebo:Person>       
        <ns6:PersonName xmlns:ns6="ZZZZZZZZZZZZZZ" xmlns="ZZZZZZZZZZZZZZ">
           <ns6:FirstName>Example3</ns6:FirstName>
           <ns6:MiddleName>Example3</ns6:MiddleName>
           <ns6:LastName>Example4</ns6:LastName>
           <ns6:PreferredName>testTest4</ns6:PreferredName>
           <ns6:Title>MRS.</ns6:Title>
        </ns6:PersonName>        
        <ns6:PhysicalAddresses xmlns:ns6="ZZZZZZZZZZZZZZ" 
            xmlns="ZZZZZZZZZZZZZZ">
           <ns6:PhysicalAddress>
              <ns15:Identification xmlns:ns15="OOOOO" xmlns="OOOOO">
                 <ns15:AddressNumber>125a6407-1b91-4d2c-a783- 
                 280127f38249</ns15:AddressNumber>
              </ns15:Identification>
              <ns15:AddressUsages xmlns:ns15="XXXXXXX" xmlns="XXXXXXX">
                 <ns15:AddressUsage>
                    <ns9:UsageCode xmlns:ns9="QQQQQ" 
                          xmlns="QQQQQ">HOME</ns9:UsageCode>
                 </ns15:AddressUsage>
              </ns15:AddressUsages>
              <ns15:EffectiveDates xmlns:ns15="XXXXXXX" xmlns="XXXXXXX">
                 <ns12:StartDateTime xmlns:ns12="LLLLLL" 
                         xmlns="LLLLLL">2018-01- 
                      07T00:00:00+00:00</ns12:StartDateTime>
                 <ns12:EndDateTime xmlns:ns12="LLLLLL" xmlns="LLLLLL">2064- 
                01-03T00:00:00+00:00</ns12:EndDateTime>
              </ns15:EffectiveDates>
              <Address1 xmlns:ns12="XXXXXXX" xmlns="XXXXXXX">Testing Address 
                        line2</Address1>
              <Address2 xmlns:ns12="XXXXXXX" xmlns="XXXXXXX">test4 
                    line2</Address2>
              <Address3 xmlns:ns12="XXXXXXX" x 
                       mlns="XXXXXXX">line33</Address3>
              <City xmlns:ns12="XXXXXXX" xmlns="XXXXXXX">Testing</City>
              <PostalCode xmlns:ns12="XXXXXXX" 
                xmlns="XXXXXXX">Testing</PostalCode>
              <Country xmlns:ns12="XXXXXXX" 
                         xmlns="XXXXXXX">Testing</Country>
           </ns6:PhysicalAddress>
           <ns6:PhysicalAddress>
              <ns15:Identification xmlns:ns15="OOOOO" xmlns="OOOOO">
                 <ns15:AddressNumber>125a6407-1b91-4d2c-a783- 
                 280127f38249</ns15:AddressNumber>
              </ns15:Identification>
              <ns15:AddressUsages xmlns:ns15="XXXXXXX" xmlns="XXXXXXX">
                 <ns15:AddressUsage>
                    <ns9:UsageCode xmlns:ns9="QQQQQ" 
                 xmlns="QQQQQ">HOME</ns9:UsageCode>
                 </ns15:AddressUsage>
              </ns15:AddressUsages>
              <ns15:EffectiveDates xmlns:ns15="XXXXXXX" xmlns="XXXXXXX">
                 <ns12:StartDateTime xmlns:ns12="LLLLLL" 
                     xmlns="LLLLLL">2018-01- 
                         07T00:00:00+00:00</ns12:StartDateTime>
                 <ns12:EndDateTime xmlns:ns12="LLLLLL" xmlns="LLLLLL">2064- 
       01-03T00:00:00+00:00</ns12:EndDateTime>
              </ns15:EffectiveDates>
              <Address1 xmlns:ns12="XXXXXXX" xmlns="XXXXXXX">Testing Address 
            line2</Address1>
              <Address2 xmlns:ns12="XXXXXXX" xmlns="XXXXXXX">test4 
             line2</Address2>
              <Address3 xmlns:ns12="XXXXXXX" 
                  xmlns="XXXXXXX">line33</Address3>
              <City xmlns:ns12="XXXXXXX" xmlns="XXXXXXX">Testing</City>
              <PostalCode xmlns:ns12="XXXXXXX" 
                  xmlns="XXXXXXX">Testing</PostalCode>
              <Country xmlns:ns12="XXXXXXX" 
                     xmlns="XXXXXXX">Testing</Country>
           </ns6:PhysicalAddress>
        </ns6:PhysicalAddresses>            
           </Studentebo:Person>
      <Studentebo:CurrentEBO>

ВЫБРАТЬ используется:

SELECT id, t.r.value('
                 declare namespace C1="mypath";
                 declare namespace CAM1="MMMMMMM";
                 declare namespace C2="ZZZZZZZZZZZZZZ";
                 declare namespace CAM2="OOOOO";
                       (.)', 'varchar(50)') as address1
FROM
[XXX_SH_SOAService_formattedXML] OUTER APPLY
[XML].nodes('
                 declare namespace C1="mypath";
                 declare namespace CAM1="MMMMMMM";
                 declare namespace C2="ZZZZZZZZZZZZZZ";
                 declare namespace CAM2="OOOOO";

 /C1:PostData/C1:data/CAM1:CurrentEBO/ 
 CAM1:Person/C2:PhysicalAddresses/C2:PhysicalAddress/CAM2:Address1') t(r)

1 Ответ

0 голосов
/ 01 июня 2018

Если конструкция этого XML находится под вашим контролем, вы должны попытаться изменить этот беспорядок в пространствах имен ... Особенно трудно понять, в каком ns элементе живет вновь и вновь вновь определенные пространства имен по умолчанию .

В большинстве случаев лучше всего указывать как можно точнее .Но здесь я бы предложил игнорировать пространства имен, используя везде подстановочные знаки:

SELECT t.ID 
      ,pers.value(N'(*:PersonName/*:FirstName/text())[1]',N'nvarchar(200)') AS Person_FirstName
      --more of Person
      ,addr.value(N'(*:Identification/*:AddressNumber/text())[1]',N'uniqueidentifier') AS Address_Number
      --AddressUsage would need one more `.nodes()`, as it is 1:n within each address
      ,addr.value(N'(*:EffectiveDates/*:StartDateTime/text())[1]',N'datetime2') AS Address_StartDateTime
      ,addr.value(N'(*:Address1/text())[1]',N'nvarchar(max)') AS Address_Address1
      ,addr.value(N'(*:Address2/text())[1]',N'nvarchar(max)') AS Address_Address2
      ,addr.value(N'(*:Address3/text())[1]',N'nvarchar(max)') AS Address_Address3
      ,addr.value(N'(*:City/text())[1]',N'nvarchar(max)') AS Address_City
      --more of the same
FROM @tbl AS t
OUTER APPLY t.YourXml.nodes(N'/*:PostData/*:data/*:CurrentEBO/*:Person') A(pers)
OUTER APPLY pers.nodes(N'*:PhysicalAddresses/*:PhysicalAddress') B(addr);

Я не понимаю этого:

У меня было бы 5 записей с различной частью адресав каждом ряду

Но вышесказанное должно указывать вам путь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...