我在我的代码中生成一个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字符串插入字段之前,我需要将~
转换为&
。
有什么想法吗?
答案 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 " attr">Some stuff here</tag>
如果您没有任何属性,则翻译双引号是可选的。
您也可以执行以下操作,但如果不这样做,它们不会导致错误:
>
=&amp; gt; '
=&amp; apos; 注意:请务必首先对&
,然后<
进行编码,然后再编"
,可能{ {1}}。如果您先没有>
,那么您最终会对之前编码的其他实体进行双重编码,从而产生类似&
而非&lt;
的内容。
由于您提到在应用程序代码中构建XML,假设您使用的是.NET,您可以使用以下方法为您执行上述所有操作:
将上述内容应用于问题中指定的XML,我们得到以下内容:
<
成功转换:)。
答案 1 :(得分:1)
XML字符串中不允许使用&
字符。它应使用Unicode point for ampersand编码为&
,用于&符号,或者编码为&
。
看看您是否可以让客户端将&
作为正确编码的&
XML发送。我还建议您创建xml
类型的列,这样您就可以依赖它包含语法正确的XML。