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

Откуда:
Сообщений: 111
Есть следующая XML структура:

declare @x xml;
set @x = N'
<note>
<test>test</test>
<message>
  <date>
    <day>12</day>
    <month>11</month>
    <year>2012</year>
  </date>
  <to>Alisa</to>
   <from>
     <name>Tolic</name>
     <city>Kiev</city>
  </from>
  <heading>Reminder</heading>
  <body>''Do not forget about party''</body>
</message>
<message>
  <date>
    <day>27</day>
    <month>11</month>
    <year>2012</year>
  </date>
  <to>Vasea</to>
  <from>
     <name>Petea</name>
     <city>Livov</city>
  </from>
  <heading>Congratulation</heading>
  <body>Happy Birthday</body>
</message>
</note>';


пишу скрипт:
SELECT   x.t.value('../../test[1]', 'nvarchar(100)')	as Test
	,x.t.value('day[1]', 'int')			as day
	,x.t.value('month[1]', 'int')			as month
	,x.t.value('year[1]', 'int')			as Year
	,x.t.value('../to[1]', 'nvarchar(100)')		as ToName
	,x.t.value('../from[1]', 'nvarchar(100)')	as FromName
	,x.t.value('../heading[1]', 'nvarchar(100)')	as Heading
	,x.t.value('../body[1]', 'nvarchar(100)')	as Body
FROM @x.nodes('/note/message/date') as x(t);

в итоге в поле FromName попадает name и city
а мне надо чтобы name и city были отдельными колонками
25 сен 13, 16:37    [14883641]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
,x.t.value('../from[1]/name[1]', 'nvarchar(100)') as FromName
25 сен 13, 16:41    [14883668]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
Maxx,
спасибо
25 сен 13, 16:43    [14883683]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
есть вот такой XML:
declare @x xml;
set @x = N'
<note>
<test>test</test>
<message>
  <date>
    <day>12</day>
    <month>11</month>
    <year>2012</year>
  </date>
  <to>Alisa</to>
  <from>
     <name>Tolic</name>
     <city>Kiev</city>
     <name>Marina</name>
     <city>Livov</city>
  </from>
  <heading>Reminder</heading>
  <body>''Do not forget about party''</body>
</message>
</note>';


пишу такой селект:
SELECT   x.t.value('../../test[1]', 'nvarchar(100)')		as Test
	,x.t.value('day[1]', 'int')				as day
	,x.t.value('month[1]', 'int')				as month
	,x.t.value('year[1]', 'int')				as Year
	,x.t.value('../to[1]', 'nvarchar(100)')			as ToName
	,x.t.value('../from[1]/name[1]', 'nvarchar(100)')	as FromName
	,x.t.value('../from[1]/city[1]', 'nvarchar(100)')	as FromCity
	,x.t.value('../from[1]/name[2]', 'nvarchar(100)')	as FromName
	,x.t.value('../from[1]/city[2]', 'nvarchar(100)')	as FromCity
	,x.t.value('../heading[1]', 'nvarchar(100)')		as Heading
	,x.t.value('../body[1]', 'nvarchar(100)')		as Body
FROM @x.nodes('/note/message/date') as x(t);


все работает как надо.
Но
<from>
     <name>Tolic</name>
     <city>Kiev</city>
     <name>Marina</name>
     <city>Livov</city>
  </from>


не всегда имеет такую структуру, там может быть и больше name и city, или from может быть пустым. Как в таком случае писать запрос?
27 сен 13, 11:52    [14891730]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
Гость333
Member

Откуда:
Сообщений: 3683
MaxiMaxiM
там может быть и больше name и city, или from может быть пустым. Как в таком случае писать запрос?

Вы хотите написать запрос с переменным числом столбцов, что ли?
27 сен 13, 11:58    [14891763]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
Гость333,

да
27 сен 13, 11:59    [14891774]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> не всегда имеет такую структуру, там может быть и больше name и city, или from
> может быть пустым. Как в таком случае писать запрос?

не-не. динамический pivot у вас даже с xml не получится без динамического же sql.
лучше подумайте о том, чтоб получать данные из from в каком-то другом виде.
ну или добавляйте в запрос FromName/FromCity до максимально возможного количества.
27 сен 13, 12:01    [14891784]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
структуру xml нужно поправить
declare @x xml;
set @x = N'
<note>
<test>test</test>
<message>
  <date>
    <day>12</day>
    <month>11</month>
    <year>2012</year>
  </date>
  <to>Alisa</to>
  <from>
     <name>Tolic</name>
     <city>Kiev</city>
  </from>
  <from>
     <name>Marina</name>
     <city>Livov</city>
  </from>
  <heading>Reminder</heading>
  <body>''Do not forget about party''</body>
</message>
</note>';


и тогда без проблем будут вытаскиваться все FROM
SELECT   x.t.value('(../../test)[1]', 'nvarchar(100)')		as Test
	,x.t.value('(../date/day)[1]', 'int')					as day
	,x.t.value('(../date/month)[1]', 'int')				as month
	,x.t.value('(../date/year)[1]', 'int')					as Year
	,x.t.value('(../to)[1]', 'nvarchar(100)')				as ToName
	,x.t.value('name[1]', 'nvarchar(100)')				as FromName
	,x.t.value('city[1]', 'nvarchar(100)')				as FromCity
	,x.t.value('(../heading)[1]', 'nvarchar(100)')		as Heading
	,x.t.value('(../body)[1]', 'nvarchar(100)')			as Body
FROM @x.nodes('/note/message/from')			as x(t);
27 сен 13, 12:07    [14891827]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
daw,
данные из from можно в принципе в любом виде, задача сводится к полученных значений name и city, для дальнейшей их обработки
27 сен 13, 12:08    [14891833]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
LexusR,
к сожалению поправить не выйдет, так как приходит уже готовый xml, и не я его формирую
27 сен 13, 12:10    [14891849]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> данные из from можно в принципе в любом виде, задача сводится к
> полученных значений name и city, для дальнейшей их обработки

ну так, и получайте их в отдельную таблицу со столбцами name и city.
27 сен 13, 12:14    [14891877]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
а, да... не сразу понял. так, примерно, можно:
select 
  t.c.value('.', 'nvarchar(1000)') name
  , t.c.value('(for $s in ../city where $s >> . return($s))[1]', 'nvarchar(1000)') city
from @x.nodes('/note/message/from/name') t(c)
27 сен 13, 12:21    [14891943]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
daw,
спасибо, то что надо
27 сен 13, 12:40    [14892063]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить