【问题标题】:TSQL Converting Characters in XMLTSQL 在 XML 中转换字符
【发布时间】:2015-01-26 15:12:33
【问题描述】:

我正在我的代码中生成一个 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 字符串插入字段之前,我需要将 ~ 转换为 &

有什么想法吗?

【问题讨论】:

  • 您应该首先生成正确的 xml。 & 应该是 &
  • 如果& 不被允许,那为什么& ;)
  • 因为裸露的& 在 xml 中是非法的。必须编码为&
  • 会破坏xml的特殊字符列表及其替换& - & < - < > - > " - " ' - '
  • SBB,不确定您是否看到了我在您接受后发布的最后一次编辑(谢谢),但如果您使用 .NET,我发现了一种超级简单的编码方法。

标签: sql-server xml tsql stored-procedures


【解决方案1】:

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

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

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

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

结果:

消息 9455,第 16 级,状态 1,第 1 行
XML解析:第1行,第7个字符,非法限定名字符

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

结果:

消息 9421,第 16 级,状态 1,第 1 行
XML 解析:第 1 行,第 7 个字符,非法名称字符

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

  • " = "

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

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

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

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

  • &gt; = >
  • ' = '

注意:请务必先编码&amp;,然后再编码&amp;lt;,然后可能是",也可能是&gt;。如果您不首先执行&amp;,那么您最终将对之前编码的其他实体进行双重编码,从而导致类似于&amp;amp;lt; 而不仅仅是&amp;lt;


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

SecurityElement.Escape


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

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

转换成功:)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多