Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос про xml  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Вопрос, как получить xml такого вида:
<root>
  <col1>1</col1>
  <cols>
    <col2>1</col2>
    <col2>2</col2>
  </cols>
</root>


Если нет данных для узла <cols>, то xml должен быть такой:

Надо получить xml такого вида:
<root>
  <col1>1</col1>
  <cols>
    <col2></col2>
  </cols>
</root>



Моя попытка:
declare @test table (id int)
insert into @test (id) values(1), (2)

select '1' as 'col1'
		,isnull((select id as col2 from @test where 1=1 for xml path(''),type,root('cols')), (select '' as 'cols/col2' for xml path('')))
for xml path('root')


При изменении условия в подзапросе на where 1=2 (имитируем отсутствие данных) структура получается иная:

<root>
  <col1>1</col1>
  <cols>
    <col2 />
  </cols>
</root>
1 июн 16, 16:39    [19246666]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про xml  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
В рамках XML <col2></col2> и <col2 /> понятие тождественные. Зачем Вам такое поведение нужно?
1 июн 16, 16:42    [19246681]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про xml  [new]
правильный проходящий.
Guest
virtuOS,
в общем-то, с точки зрения стандарта XML, и получаемый, и желаемый "формат" абсолютно одинаковы и одинаково понимаются любыми нормальными XML-парсерами. И потому вопрос надуманный и не стОящий того, чтобы на него тратить время.
1 июн 16, 16:44    [19246693]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про xml  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Заказчик такое техзадание прислал. Я не уверен, что вариант с <col2 /> его устроит.

И возник ещё один вопрос: почему sql не всегда экранирует специальные символы (такие как ", перенос строки). Например, генерируется такой xml:

<root>
<col1>1

5</col1>
<cols>
<col2>1</col2>
<col2>2</col2>
</cols>
</root>

В то же время другие средства работы с xml (например, DOMDocument в php) создает так:
<root>
<col1>1

5</col1>
<cols>
<col2>1</col2>
<col2>2</col2>
</cols>
</root>

Кто в данном случае прав?
1 июн 16, 16:53    [19246729]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про xml  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Вот так правильно:
<root>
  <col1>1&#13;
&#13;
5</col1>
  <cols>
    <col2>1</col2>
    <col2>2</col2>
  </cols>
</root>
1 июн 16, 16:55    [19246735]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про xml  [new]
Konst_One
Member

Откуда:
Сообщений: 11562
всё там нормально:

declare @test table (id int)
insert into @test (id) values(1), (2)

select '1' as 'col1'
		,isnull((select id as col2 from @test where 1=2 for xml path(''),type,root('cols')), 
		(select '1'+CHAR(13)+'5' as 'cols/col2' for xml path('')))
for xml path('root')



<root><col1>1</col1><cols><col2>1&#x0D;5</col2></cols></root>
1 июн 16, 16:58    [19246746]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про xml  [new]
правильный проходящий.
Guest
virtuOS
Заказчик такое техзадание прислал. Я не уверен, что вариант с <col2 /> его устроит.
А он что, глазками читать будет? Или таки какую-то программу на него натравливать? Еще раз - нормальные программы этой разницы не заметят. А если какая-то левая самописка - это их проблемы.
1 июн 16, 17:01    [19246767]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про xml  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
virtuOS
Заказчик такое техзадание прислал. Я не уверен, что вариант с <col2 /> его устроит.

Подобного рода вопрос частенько задают на SO. В спецификации все прописано что и как считать идентичными нодами. Если заказчику нужно именно как Вы показали то можете хоть строки клеять... но в итоге получите это:

DECLARE @x XML = '<root></root>'
SELECT @x
1 июн 16, 17:01    [19246771]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить