SQL 服务器 xml 反序列化

SQL Server xml deserialization

我有这个用于反序列化 xml 的脚本示例,但我从中得到了一个奇怪的描述(附件)

我如何编写此代码以获得 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)

在我看来你的描述已经 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

您可以调用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 |