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

<?xml version="1.0" encoding="utf-8"?>
<p1 a1="wqefqw" a2="we">
  <p2>qwefq</p2>
  <p2 a3="qwef">
    <p3 a4="">qwefq</p3>
    <p4></p4>
  </p2>
</p1>


Как с помощью XQUERY преобразовать его в плускую стркутуру:

путь_к_элементу : значение

p1_a1 : wqefqw
p1_a2 : we
p1_p2 : qwefq
p1_p2_a3 : qwef
p1_p2_p3_a4 :
p1_p2_p3 : qwefq
3 дек 14, 10:35    [16941710]     Ответить | Цитировать Сообщить модератору
 Re: xquery помогите с запросом  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
мимо крокодил 000111один,

declare @xml xml = '<p1 a1="wqefqw" a2="we">
  <p2>qwefq</p2>
  <p2 a3="qwef">
    <p3 a4="">qwefq</p3>
    <p4></p4>
  </p2>
</p1>'

-- можно так для ограниченного числа уровней (аналогичное можно еще с помощью нескольких nodes() объединенных outer apply-ами сделать)
select 
  isnull(nullif('_' + t.c.value('local-name(../../../../../..)', 'varchar(1000)'), '_'), '') 
  + isnull(nullif('_' + t.c.value('local-name(../../../../..)', 'varchar(1000)') , '_'), '') 
  + isnull(nullif('_' + t.c.value('local-name(../../../..)', 'varchar(1000)')    , '_'), '') 
  + isnull(nullif('_' + t.c.value('local-name(../../..)', 'varchar(1000)')       , '_'), '') 
  + isnull(nullif('_' + t.c.value('local-name(../..)', 'varchar(1000)')          , '_'), '') 
  + isnull(nullif('_' + t.c.value('local-name(..)', 'varchar(1000)')             , '_'), '') 
  + isnull(nullif('_' + t.c.value('local-name(.)', 'varchar(1000)')              , '_'), '')
  , t.c.value('.', 'varchar(1000)')  
from @xml.nodes('//*/text(), //*/@*') t(c)
;

-- или вот такого монстра для неограниченного (здесь я, правда, не поручусь на все 100%, что ноды в пути всегда в правильном порядке будут идти).
select
  --t.c.value('local-name(.)', 'varchar(1000)')
  replace(t.c.query('(for $s1 in (//*), $s2 in ($s1//*/text(), $s1//@*) where ($s1 << .) and $s2 is . return(local-name($s1)))').value('.', 'varchar(1000)'), ' ', '_')
  + isnull(nullif('_' + t.c.value('local-name(.)', 'varchar(1000)'), '_'), '')
  , t.c.value('.', 'varchar(1000)')
from @xml.nodes('//*/text(), //*/@*') t(c)
;
3 дек 14, 12:28    [16942595]     Ответить | Цитировать Сообщить модератору
 Re: xquery помогите с запросом  [new]
мимо крокодил 000111один
Guest
daw,

спасибо, тоже такие мысли были. пожалуй я все же xslt сделаю наверно. это небольшая залипуха на время делается.
3 дек 14, 13:19    [16943123]     Ответить | Цитировать Сообщить модератору
 Re: xquery помогите с запросом  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
мимо крокодил 000111один
Есть произвольный xml

<?xml version="1.0" encoding="utf-8"?>
<p1 a1="wqefqw" a2="we">
  <p2>qwefq</p2>
  <p2 a3="qwef">
    <p3 a4="">qwefq</p3>
    <p4></p4>
  </p2>
</p1>


какая дурацкая задачаРаз уж xml произвольный что на выходе вы будете ожидать вот от такого:
<?xml version="1.0" encoding="utf-8"?>
<p1 a1="wqefqw" a2="we">qwe
  <p2>qwefq</p2>rty
  <p2 a3="qwef">uio
    <p3 a4="">qwefq</p3>pas
    <p4></p4>
    <![CDATA[
      <йцукенг?>
    ]]>
  </p2>
</p1>

?
3 дек 14, 15:27    [16944179]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить