2015-08-05 8 views
2

У меня есть этот пример сценария для десериализации в XML, но я получаю странное описание от него (прилагается) enter image description hereSQL XML Server десериализация

Как я могу написать это, чтобы получить Atom cloth - Black/grey - который является правый десериализация?

Спасибо

declare @x xml 
set @x = '<options> 
<option> 
<code>99248</code> 
<description>Atom&amp;#32;cloth&amp;#32;&amp;#45;&amp;#32;Black&amp;#47;grey</description> 
<monthlycost>0.00</monthlycost> 
<allowed /> 
</option> 
<option> 
<code>99239</code> 
<description>Metallic&amp;#32;&amp;#45;&amp;#32;Sargasso&amp;#32;blue</description> 
<monthlycost>12.85</monthlycost> 
<allowed /> 
</option> 
</options>' 


select 
    pref.value('(code/text())[1]', 'varchar(32)') as Code   
    ,pref.value('(description/text())[1]', 'varchar(80)') as [Description] 
    ,pref.value('(monthlycost/text())[1]', 'varchar(32)') as MontlyCost 
from 
    @X.nodes('/options/option') AS Options(pref) 

ответ

1

Вы можете вызвать value() метод дважды экранирования в сущности два раза, например:

select 
    pref.value('(code/text())[1]', 'varchar(32)') as Code   
    ,pref.value('(description/text())[1]', 'varchar(80)') as [Description] 
    ,CONVERT(XML, 
      pref.value('(description/text())[1]', 'varchar(80)') 
    ).value('.', 'varchar(80)') as [DescriptionFixed] 
    ,pref.value('(monthlycost/text())[1]', 'varchar(32)') as MontlyCost 
from 
    @X.nodes('/options/option') AS Options(pref) 

Sqlfiddle Demo

выход:

| Code |         Description |   DescriptionFixed | MontlyCost | 
|-------|---------------------------------------------|--------------------------|------------| 
| 99248 | Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey | Atom cloth - Black/grey |  0.00 | 
| 99239 | Metallic&#32;&#45;&#32;Sargasso&#32;blue | Metallic - Sargasso blue |  12.85 | 
+0

Спасибо, это очень полезно. – user3253051

+0

У меня есть еще один ... я упоминал, что ненавижу xml? : D – user3253051

0

Она смотрит на меня, как ваши описания были HTML убежали, а затем XML убежали.

Оригинал:

Atom cloth - Black/grey 

HTML побег и конвертировать пространства, слэш и тире количество кодов HTML:

Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey 

XML побег и конвертировать амперсанд в &amp;:

Atom&amp;#32;cloth&amp;#32;&amp;#45;&amp;#32;Black&amp;#47;grey 

И это то, что у вас есть в вашей переменной:

Atom&amp;#32;cloth&amp;#32;&amp;#45;&amp;#32;Black&amp;#47;grey 

Вам нужно будет пропустить описания через функции unescape, но я не верю, что есть какие-либо встроенные функции, которые это делают. Там же метод значение, как это, как вы делаете:

declare @x xml = ''; 

select @x.value('"Atom&amp;#32;cloth&amp;#32;&amp;#45;&amp;#32;Black&amp;#47;grey"','nvarchar(50)'); 

Но это только декодирует XML и получает вас HTML спасся результат:

Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey 

Вы должны сделать это снова, чтобы получить окончательный результат:

select @x.value('"Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey"','nvarchar(50)') 

Atom cloth - Black/grey 
Смежные вопросы