【问题标题】:Avoid encoding of ampersand in SQL XML attribute避免在 SQL XML 属性中编码 & 符号
【发布时间】:2016-06-24 00:03:12
【问题描述】:

图片我有一个货币表,包含例如这条记录:
- ID = 1
- 代码 = EUR
- 符号 = €
重要注意事项:
我们数据库中的输入已经是 HTML 编码的属性!

现在,当我使用这条 SQL 语句时:

SELECT '@id'        = Currency.Id
    , '@code'       = Currency.Code
    , '@symbol'     = Currency.Symbol
FROM Currency
FOR XML PATH('currency')
    , ROOT('list')
    , TYPE
;

...不幸的是,它会生成以下 XML:

<list><currency id="1" code="EUR" symbol="&amp;euro;" /></list>

请注意,欧元符号已被重新编码,使其无效。

我怎样才能避免这种情况?如何获得以下 XML 输出:

<list><currency id="1" code="EUR" symbol="&euro;" /></list>

【问题讨论】:

  • 请注意,大多数在 SO 上提供答案的专业人士都渴望获得声誉积分。 Please read this: someone-answers。谢谢!
  • 对不起,Shnugo。我还没有投票或接受,因为到目前为止我还没有找到我正在寻找的解决方案。我才刚刚开始在心理上接受我正在寻找的解决方案将不可用......

标签: sql sql-server xml sqlxml


【解决方案1】:

不幸得到的结果是重新编码无效是完全正确的——但不是你所期望的。你传入&amp;amp;euro;,这是一个字符串。在 XML 中,这被转义为 &amp;amp;euro;,并将重新编码为 &amp;amp;euro;

您必须停止将 XML 视为一种形式化的字符串。这是一个技术问题。 XML 将隐式处理。

有两种方式:

  • 采用字符串方式并将您的 XML 转换为 NVARCHAR,执行您可能想要的任何字符串操作(例如 REPLACE(myXML,'&amp;amp;euro;','&amp;euro;') 并转换回 XML 或

  • (我更喜欢这个!)将 € 作为实际符号并让 XML 引擎进行编码。

编辑

还有一件事:SQL Server 不知道&amp;amp;euro; 实体。试试&amp;#8364;&amp;#x20AC;

SELECT '€' AS [@EuroSign]               --works
      ,'&euro;' AS [@NamedEscapedEuro]  --will be encoded
      ,'&#8364;' AS [@EscapedEuro]      --will be encoded
FOR XML PATH('TestEuro'),ROOT('root')

SELECT --CAST('<x>'+'€'+'</x>' AS XML).value('/x[1]','nvarchar(10)') AS [@EuroSign]              --not allowed!!!
       --CAST('<x>'+'&euro;'+'</x>' AS XML).value('/x[1]','nvarchar(10)') AS [@NamedEscapedEuro] --not allowed, exists, but not known in SQL Server!
       CAST('<x>'+'&#8364;'+'</x>' AS XML).value('/x[1]','nvarchar(10)') AS [@EscapedEuro]       --works
FOR XML PATH('TestEuro'),ROOT('root') 

【讨论】:

  • 不是我希望的解决方案,但显然你是对的。我将采用您首选的解决方案:将 €-symbol 作为实际符号存储在我的数据库中,因此 XML 会将其正确编码为 €
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 2013-03-16
  • 2011-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多