SQL 服务器 xml 反序列化
SQL Server xml deserialization
我有这个用于反序列化 xml 的脚本示例,但我从中得到了一个奇怪的描述(附件)
我如何编写此代码以获得 Atom cloth - Black/grey
- 这是 正确的 反序列化?
谢谢
declare @x xml
set @x = '<options>
<option>
<code>99248</code>
<description>Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey</description>
<monthlycost>0.00</monthlycost>
<allowed />
</option>
<option>
<code>99239</code>
<description>Metallic&#32;&#45;&#32;Sargasso&#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 cloth - Black/grey
XML 转义并将符号转换为 &
:
Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey
这就是您的变量中的内容:
Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey
您必须通过 unescape 函数将描述推回,但我认为没有任何本机函数可以这样做。有像这样的值方法:
declare @x xml = '';
select @x.value('"Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey"','nvarchar(50)');
但这只是对 XML 进行了转义,并为您提供了 HTML 转义结果:
Atom cloth - Black/grey
你必须再做一遍才能得到你的最终结果:
select @x.value('"Atom cloth - Black/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)
输出:
| Code | Description | DescriptionFixed | MontlyCost |
|-------|---------------------------------------------|--------------------------|------------|
| 99248 | Atom cloth - Black/grey | Atom cloth - Black/grey | 0.00 |
| 99239 | Metallic - Sargasso blue | Metallic - Sargasso blue | 12.85 |
我有这个用于反序列化 xml 的脚本示例,但我从中得到了一个奇怪的描述(附件)
我如何编写此代码以获得 Atom cloth - Black/grey
- 这是 正确的 反序列化?
谢谢
declare @x xml
set @x = '<options>
<option>
<code>99248</code>
<description>Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey</description>
<monthlycost>0.00</monthlycost>
<allowed />
</option>
<option>
<code>99239</code>
<description>Metallic&#32;&#45;&#32;Sargasso&#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 cloth - Black/grey
XML 转义并将符号转换为 &
:
Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey
这就是您的变量中的内容:
Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey
您必须通过 unescape 函数将描述推回,但我认为没有任何本机函数可以这样做。有像这样的值方法:
declare @x xml = '';
select @x.value('"Atom&#32;cloth&#32;&#45;&#32;Black&#47;grey"','nvarchar(50)');
但这只是对 XML 进行了转义,并为您提供了 HTML 转义结果:
Atom cloth - Black/grey
你必须再做一遍才能得到你的最终结果:
select @x.value('"Atom cloth - Black/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)
输出:
| Code | Description | DescriptionFixed | MontlyCost |
|-------|---------------------------------------------|--------------------------|------------|
| 99248 | Atom cloth - Black/grey | Atom cloth - Black/grey | 0.00 |
| 99239 | Metallic - Sargasso blue | Metallic - Sargasso blue | 12.85 |