Изменение вывода XML

Я сгенерировал XML следующим образом, за исключением тега, который я выделил красным.

введите описание изображения здесь

Как я могу добавить следующую строку, помеченную красным к Accounts tag: ba.cbbh.crr.retail, чтобы он выглядел так, как указано на фотографии выше? (Теперь это выглядит так)

Учтите, что я должен избегать синтаксических ошибок XML, таких как пробел, но сохранять пробел после учетных записей.

(<Accounts xmlns="ba.cbbh.crr.retailba.cbbh.crr.retail">)

Я пробовал это, но ничего не меняется...

DECLARED ALL...

SET @ACCOUNTTYPE = 'T';

SET @kodBanke = ( SELECT vrednost FROM dbini WHERE IDENT = 'KOD' AND SECTION = 'PP' );
SET @XML_info = '<?xml version="1.0" encoding="UTF-8"?>';
SET @xmlnsDodatak =  'ba.cbbh.crr.retail';



IF (@tabelaTipaRacuna = 'istdev')
BEGIN
SELECT @SQL =  'WITH Ent_Posta
            AS
        (
           SELECT e.naziv,p.posta,e.sifra
            FROM entitet AS e
          INNER JOIN poste AS p ON e.sifra = p.entitet
        )

           SELECT [dbo].[brojracuna](' + @kodBanke + ',i.partija) AS ''AccountNo/BBAN'',
           [dbo].[GENERATEIBAN](i.partija) AS ''AccountNo/IBAN'', 
           ' + '''D''' + ' AS ''AccountType'',
           (a.ime + ''('' + a.roditel + '')''  + a.prezime) AS ''Name'',
           a.embg AS ''UID'',
       CASE status 
       WHEN 2 THEN ''A'' 
       WHEN 4 THEN ''B''
       WHEN 8 THEN ''U''
  END AS ''Status'',
  c.sifra AS ''Territory'',
  ' + @kodBanke + ' as ''ID_Bank'',
  CONVERT(DATETIME,' + 'i.dotvoranje' + ',120) AS ''OpeningDate'',
  ISNULL(CONVERT(DATETIME,' + '1' + ',120),'''') AS ''ClosingDate''
 FROM adresar AS a
  INNER JOIN' + QUOTENAME(@tabelaTipaRacuna) + ' AS i 
      ON a.embg = i.embg
        INNER JOIN Ent_Posta as c
        ON a.postbroj = c.posta 
        FOR XML PATH(''Account''), ROOT(''Accounts'')'

         SELECT @SQL = REPLACE(@SQL, '''<Accounts>''', '''<Accounts xmlns="' + @xmlnsDodatak + '">''')
         SELECT @SQL
         EXEC(@SQL)

Решение:

Это то, что сработало для меня...

 ...'WITH XMLNAMESPACES(DEFAULT ''ba.cbbh.crr.retail''), Ent_Posta
            AS
        (
           SELECT e.naziv,p.posta,e.sifra
            FROM entitet AS e
          INNER JOIN poste AS p ON e.sifra = p.entitet
        )...



... INNER JOIN Ent_Posta as c
    ON a.postbroj = c.posta 
    FOR XML PATH(''Account''), ROOT(''Accounts'')'...

Редактировать:

Теперь я хочу это:

введите описание изображения здесь

После небольшого исследования я понял, что это должно выглядеть примерно так:

...SELECT @SQL = 'SELECT ''<?xml version=""1.0"" encoding=""UTF-8""?>''' + ''

         'WITH XMLNAMESPACES(DEFAULT ''ba.cbbh.crr.retail''), Ent_Posta
            AS
        (
           SELECT e.naziv,p.posta,e.sifra
            FROM entitet AS e
          INNER JOIN poste AS p ON e.sifra = p.entitet
        ) ...

Видимо, это не сработает. Что не так с этим?

1 ответ

Решение

Это пространство имен по умолчанию. Так что следуйте этому примеру:

Указание пространств имен по умолчанию Вместо того, чтобы объявлять префикс пространства имен, вы можете объявить пространство имен по умолчанию, используя ключевое слово DEFAULT. В запросе FOR XML он свяжет пространство имен по умолчанию с узлами XML в результирующем XML. В следующем примере WITH XMLNAMESPACES определяет два префикса пространства имен, которые определяются вместе с пространством имен по умолчанию.

WITH XMLNAMESPACES ('uri1' as ns1,   
                    'uri2' as ns2,  
                    DEFAULT 'uri2')  
SELECT ProductID,   
      Name,  
      Color  
FROM Production.Product   
WHERE ProductID=316 or ProductID=317  
FOR XML RAW ('ns1:Product'), ROOT('ns2:root'), ELEMENTS  

Добавьте пространства имен в запросы с помощью WITH XMLNAMESPACES

У вас есть CTE, и в сочетании с XMLNAMESPACES это будет выглядеть так:

WITH XMLNAMESPACES ('uri1' as ns1,   
                    'uri2' as ns2,  
                    DEFAULT 'uri2'),
q as
(
SELECT ProductID,   
      Name,  
      Color  
FROM Production.Product   
WHERE ProductID=316 or ProductID=317  
)
select *
from q
FOR XML RAW ('ns1:Product'), ROOT('ns2:root'), ELEMENTS  
Другие вопросы по тегам