SQL Server 2005 «FOR XML PATH» Несколько тегов с одинаковым именем - PullRequest
3 голосов
/ 23 марта 2009

У меня есть структура XML, подобная следующей

<root>
    <person>
        <name>James</name>
        <description xsi:type="me:age">12</description>
        <description xsi:type="me:height>6 foot</description>
...

Который я должен вытащить из стола, как ...

лицо

Имя, Возраст, Рост

Я пытаюсь использовать путь FOR XML в SQL 2005 с запросом, подобным

SELECT
Name as 'name'
Age as 'description xsi:type="me:age"'
Height as 'description xsi:type="me:height"'
FOR XML PATH('person')

Но это дает мне ошибку об отсутствии пространства имен 'description xsi'. Есть ли способ добиться этого с помощью FOR XML PATH. Фактический запрос является более сложным, чем этот пример, и для его изменения потребуется много усилий.

Спасибо

Ответы [ 5 ]

5 голосов
/ 12 апреля 2009

FOR XML PATH иногда немного сложен (по крайней мере, насколько я знаю). Это может привести вас туда:

WITH XMLNAMESPACES('uri' as xsi)    
SELECT    
'me:age'     AS 'description/@xsi:type'    
,age         AS 'description'    
,name        AS 'name'   
,'me:height' AS 'description/@xsi:type'    
,height      AS 'description'    
FROM #test    
FOR XML PATH('person')

Производит:

<person xmlns:xsi="uri">
  <description xsi:type="me:age">32</description>
  <name>Alice</name>
  <description xsi:type="me:height">6 Foot</description>
</person>
<person xmlns:xsi="uri">
  <description xsi:type="me:age">24</description>
  <name>Bob</name>
  <description xsi:type="me:height">5 Feet 5 Inches</description>
</person>
1 голос
/ 10 декабря 2011
<rt> 
  <A> 
    <B> 
      <C> 
        <D> 
          <E>a</E> 
          <F>b</F> 
          <G>c</G> 
        </D> 
    <D> 
          <E>x</E> 
          <F>y</F> 
          <G>z</G> 
        </D> 
      </C> 
    </B> 
  </A> 
</rt> 

- после печати тега я добавил в свой запрос следующее поле, чтобы тег закрывался и открывался

,(SELECT * FROM          
    (SELECT '' AS 'text()'           
    ) l         
    FOR XML PATH(''),type) as 'A/B/C' 

- использованный заимствованный код

1 голос
/ 22 июня 2011

Хорошее решение, похожее на eddiegroves, но без необходимости переупорядочивать одноименных братьев и сестер можно найти здесь .

Пример адаптированного кода (также модифицированный из ответа Эддигровса):

WITH XMLNAMESPACES('uri' as xsi)
SELECT name AS 'person/name'
,   'me:age' AS 'person/description/@xsi:type'
,   age AS 'person/description'
,   '' AS 'person'
,   'me:height' AS 'person/description/@xsi:type'
,   height AS 'person/description'
,   '' AS 'person'
,   'me:weight' AS 'person/description/@xsi:type'
,   weight AS 'person/description'
FROM #test
FOR XML PATH('')
1 голос
/ 23 марта 2009

Я не думаю, что возможно иметь дело с одноуровневыми узлами с использованием FOR XML PATH.

Мне удалось сгенерировать вашу схему, используя FOR XML EXPLICIT.

Вывод не является допустимым XML, так как не содержит определения для тогда xsi пространства имен, но он соответствует вашей спецификации:

create table #test
(id int identity
,name varchar(50)
,age int
,height varchar(20))

insert #test (name,age,height)
select 'Alice',32,'6 feet one inch'
union select 'Bob',30,'5 feet 10 inches'
union select 'Charles',23,'6 feet two inch'

SELECT 1         AS Tag
       ,NULL     AS Parent
       ,''       AS [root!1]
       ,null     AS [person!2!name!ELEMENT]
       ,null     AS [description!3]
       ,null     AS [description!3!xsi:type]  
       ,null     AS [description!4]
       ,null     AS [description!4!xsi:type]     
UNION ALL
SELECT 2         AS Tag
       ,1        AS Parent
       ,null
       ,name
       ,null
       ,null 
       ,null
       ,null    
FROM #test
UNION ALL
SELECT 3         AS Tag
       ,2        AS Parent
       ,null       
       ,name     
       ,age      
       ,'me:age' 
       ,null
       ,null 
FROM #test
UNION ALL
SELECT 4         AS Tag
       ,2        AS Parent
       ,null       
       ,name     
       ,null
       ,null
       ,height   
       ,'me:height'
FROM #test
order by [person!2!name!ELEMENT],Tag
FOR XML EXPLICIT
0 голосов
/ 25 февраля 2010

Нам нужно было сделать что-то вроде этого ...

<rt>
  <A>
    <B>
      <C>
        <D>
          <E>a</E>
          <E>b</E>
          <E>c</E>
          <E>d</E>
        </D>
      </C>
    </B>
  </A>
</rt>

Имеет повторяющиеся элементы E.

Мы сделали это с t-sql ниже.

select 
    '' as "A/B/C/D"
    ,
    (
        SELECT * FROM 
        (
              SELECT 'a' AS 'text()'
        UNION SELECT 'b' AS 'text()'
        UNION SELECT 'c' AS 'text()'
        UNION SELECT 'd' AS 'text()'
        ) l
        FOR XML PATH('E'),type 
    ) as 'A/B/C/D'

from [Case]
where [Case].CaseRef = 'YOUR_PKEY' 
for xml path('rt')
go 

Должно быть также возможно совать атрибуты xsi ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...