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 字符串中不允许 &
字符。它应该被编码为 &
,用于和号,或者编码为 &
,使用 Unicode point for ampersand.
看看您能否让您的客户发送 &
正确编码 &
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 " attr">Some stuff here</tag>
如果您没有任何属性,那么翻译双引号是可选的。
您也可以执行以下操作,但如果您不这样做,它们不会导致错误:
>
= >
'
= '
注意:一定要编码&
先,然后<
,然后也许"
并且可能 >
。如果您不首先执行 &
那么您最终将对之前编码的其他实体进行双重编码,从而导致类似 &lt;
而不仅仅是 <
.
并且由于您提到在应用程序代码中构建 XML,假设您使用的是 .NET,您可以使用以下方法为您完成上述所有操作:
将以上内容应用于问题中指定的 XML,我们得到以下内容:
SELECT CONVERT(XML,
'<optional><fields><department>Dogs & Cats</department></fields></optional>'
);
转换成功:).
我在发送到存储过程的代码中生成了一个 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 字符串中不允许 &
字符。它应该被编码为 &
,用于和号,或者编码为 &
,使用 Unicode point for ampersand.
看看您能否让您的客户发送 &
正确编码 &
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 " attr">Some stuff here</tag>
如果您没有任何属性,那么翻译双引号是可选的。
您也可以执行以下操作,但如果您不这样做,它们不会导致错误:
>
= >'
= '
注意:一定要编码&
先,然后<
,然后也许"
并且可能 >
。如果您不首先执行 &
那么您最终将对之前编码的其他实体进行双重编码,从而导致类似 &lt;
而不仅仅是 <
.
并且由于您提到在应用程序代码中构建 XML,假设您使用的是 .NET,您可以使用以下方法为您完成上述所有操作:
将以上内容应用于问题中指定的 XML,我们得到以下内容:
SELECT CONVERT(XML,
'<optional><fields><department>Dogs & Cats</department></fields></optional>'
);
转换成功:).