TSQL转换XML中的字符

时间:2015-01-26 15:12:34

标签: sql-server xml tsql stored-procedures

我在我的代码中生成一个XML字符串,我将其发送到我的存储过程。由于包含&符号&的特定数据,我必须在发送XML字符串之前将其转换为其他内容,因为它与XML结构混淆。

我将XML字符串中的&的任何实例转换为~

通常情况下,在我将要将数据添加到字段并且工作正常时,我已经重新转换了该字符。

但是,这次我将XML节点插入到一个字段中,该字符包含在该节点中。

 INSERT INTO TFS_Feedback_New (submitTime, type, reasonID, status, outcome, Details, submitterQID, submitterSupQID, submitterDepartment, submitterGeoLocationDesc, targetQID, targetSupQID, targetDepartment, targetGeoLocationDesc, feedbackOriginal)
SELECT GETUTCDATE(),
       @feedbackType,
       @feedbackReason,
       @status,
       'Pending',
       @xml.query('/data/optional'),
       @submitterQID,
       @SubmitterSupQID,
       @SubmitterDept,
       @SubmitterLoc,
       @TargetQID,
       @TargetSupQID,
       @TargetDept,
       @TargetLoc,
       @feedback

如您所见,有一个字段@xml.query('/data/optional')。这就是包含我需要替换的字符的XML字符串。

以下是我发送给存储过程<optional><fields><department>Dogs ~ Cats</department></fields></optional>

的XML

在将XML字符串插入字段之前,我需要将~转换为&

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您需要进行适当的XML实体编码。您需要做的最低限度是:

  • & =&amp; amp;
  • < =&amp; lt;

这是导致转换为XML时导致错误的唯一两个:

SELECT CONVERT(XML, '<tag><</tag>');

结果:

  

Msg 9455,Level 16,State 1,Line 1
  XML解析:第1行,第7个字符,非法限定名称字符

SELECT CONVERT(XML, '<tag>&</tag>');

结果:

  

Msg 9421,Level 16,State 1,Line 1
  XML解析:第1行,第7个字符,非法名称字符

IF 您正在使用基于属性的XML而不是基于元素的,那么您还需要翻译双引号:

  • " =&amp; quot;

这是因为它可能被放置在如下属性中:

<tag attribute="test &quot; attr">Some stuff here</tag>

如果您没有任何属性,则翻译双引号是可选的。

您也可以执行以下操作,但如果不这样做,它们不会导致错误:

  • > =&amp; gt;
  • ' =&amp; apos;

注意:请务必首先对& ,然后<进行编码,然后再编",可能{ {1}}。如果您先没有>,那么您最终会对之前编码的其他实体进行双重编码,从而产生类似&而非&amp;lt;的内容。


由于您提到在应用程序代码中构建XML,假设您使用的是.NET,您可以使用以下方法为您执行上述所有操作:

SecurityElement.Escape


将上述内容应用于问题中指定的XML,我们得到以下内容:

&lt;

成功转换:)。

答案 1 :(得分:1)

XML字符串中不允许使用&字符。它应使用Unicode point for ampersand编码为&amp;,用于&符号,或者编码为&#038;

看看您是否可以让客户端将&作为正确编码的&amp; XML发送。我还建议您创建xml类型的列,这样您就可以依赖它包含语法正确的XML。