TSQL 转换 XML 中的字符

TSQL Converting Characters in XML

我在发送到存储过程的代码中生成了一个 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 字符串的内容,该字符串具有我需要替换的字符。

这里是XML我发送给存储过程<optional><fields><department>Dogs ~ Cats</department></fields></optional>

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

有什么想法吗?

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

看看您能否让您的客户发送 & 正确编码 &amp; XML。我还建议您制作 xml 类型的专栏,这样您就可以依赖它包含语法正确的 XML.

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

  • & = &
  • < = <

只有这两个在转换为 XML 时会导致错误:

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

结果:

Msg 9455, Level 16, State 1, Line 1
XML parsing: line 1, character 7, illegal qualified name character

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

结果:

Msg 9421, Level 16, State 1, Line 1
XML parsing: line 1, character 7, illegal name character

如果你做的是基于属性的XML而不是基于元素的,那么你还需要翻译双引号:

  • " = “

这是因为它可能被放置在一个属性中,例如:

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

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

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

  • > = >
  • ' = '

注意:一定要编码&,然后<,然后也许" 并且可能 >。如果您不首先执行 & 那么您最终将对之前编码的其他实体进行双重编码,从而导致类似 &amp;lt; 而不仅仅是 &lt;.


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

SecurityElement.Escape


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

SELECT CONVERT(XML,
       '<optional><fields><department>Dogs &amp; Cats</department></fields></optional>'
              );

转换成功:).