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

Откуда: Moscow Square
Сообщений: 635
Дано: таблица с полем xml.
xml вида:

<root>
<property1>value1</property1>
<property2>value2</property2>
<property3>value3</property3>
</root>


Надо получить таблицу свойств вида ключ-значение:

property1 value1
property2 value2
property3 value3


Главная проблема в том, что список полей property1, property2, property3 - произвольный, то есть до выполнения скрипта я его не знаю. Есть вариант, как это реализовать встроенными средствами работы MS SQL с типом xml?
Потому что единственный вариант, который я вижу - парсить содержимое узла root как текстовую строку в цикле.
Может есть что-то менее бесмысленное и беспощадное?
12 мар 12, 11:11    [12229970]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг поля с типом xml  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Oblom,

declare @xml xml
set @xml= N'<root>
<property1>value1</property1>
<property2>value2</property2>
<property3>value3</property3>
</root>
'


SELECT 
 x.n.value('local-name(.)','varchar(20)' ) p
FROM @xml.nodes('root/*') x(N)
12 мар 12, 11:29    [12230107]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг поля с типом xml  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
declare
  @x xml;
set @x=N'
<root>
<property1>value1</property1>
<property2>value2</property2>
<property3>value3</property3>
</root>';
select
  t.node.value('@name', 'varchar(10)') [key],
  t.node.value('@value', 'varchar(10)') [value]
from (
  select @x.query('for $node in /root/* return <node name="{local-name($node)}" value="{$node[1]}"/>')
) x(querydata) cross apply x.querydata.nodes('//node') t(node)
12 мар 12, 11:34    [12230145]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг поля с типом xml  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Сон Веры Павловны,
спасибо, то что нужно!
12 мар 12, 12:13    [12230469]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг поля с типом xml  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Оказывается, в общем виде XML выглядит так:

<root>
  <property1>value1</property1>
  <property2>value2</property2>
  <property3>
    <property4>value4</property4>
    <property4>value5</property4>
  </property3>
</root>


а получить надо таблицу вида:
property1 value1
property2 value2
property4 value4
property4 value5


Это реально сделать?
12 мар 12, 13:46    [12231329]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг поля с типом xml  [new]
iljy
Member

Откуда:
Сообщений: 8711
Oblom,

declare @xml xml='<root>
  <property1>value1</property1>
  <property2>value2</property2>
  <property3>
    <property4>value4</property4>
    <property4>value5</property4>
  </property3>
</root>'

SELECT  x.n.value('local-name(.)','varchar(20)' ) p
FROM @xml.nodes('root//*[text()]') x(N)
12 мар 12, 13:54    [12231400]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг поля с типом xml  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
iljy, спасибо!
12 мар 12, 14:12    [12231557]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг поля с типом xml  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Чуть дополню.
SELECT  x.n.value('local-name(.)','varchar(20)' ) p, x.n.value('.','varchar(20)' ) v
FROM @xml.nodes('root//*[text()]') x(N)
12 мар 12, 14:16    [12231605]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить