【发布时间】:2013-11-21 20:08:06
【问题描述】:
当我尝试在 MS SQL Server 中将字符串转换为 XML 时,我遇到了非常奇怪的错误:
消息 9420,第 16 层,状态 1,第 5 行
XML解析:第1行,字符8071,非法xml字符
如果我在某些文本编辑器中检查字符串,我可以看到它的长度是 8070。如果它不存在,为什么它会抱怨字符 8071?
这就是我将字符串转换为 XML 的方式:
CAST(REPLACE(SUBSTRING(
REPLACE(REPLACE(REPLACE(ResponseData,'ä','a'),'ö','o'),'å','a'),
PATINDEX('%<?xml%',ResponseData), PATINDEX('%sonType>', ResponseData)+6),
'<?xml version="1.0" encoding="utf-16"?>',
'<?xml version="1.0" encoding="utf-8"?>')as XML) as ResponseData
是否有任何替换导致问题?
UPD:问题还在于,在ResponseData 列中,XML 字符串与其他一些数据一起存储。示例:
Error from service: <Some error description>. Sent request: <?xml version="1.0" encoding="utf-16"?><Contents of the XML>
所以我需要从列中获取 XML 字符串,然后将其转换为 XML。
【问题讨论】:
-
你为什么要用
encoding="utf-16"替换标题encoding="utf-8"??这可能会导致问题 - 您可以尝试而不执行此替换步骤吗?另外:表中ResponseData列的数据类型是什么?? -
@marc_s 没有那个替换我得到
unable to switch the encoding错误。ResponseData列的类型为varchar(max)。 -
您需要使用
CONVERT并在转换列时执行两个步骤:CAST(CAST(ResponseData as NVARCHAR(max)) AS XML)- 首先您需要将ResponseData转换为NVARCHAR 因为您将其定义为utf-16(= Unicode) 编码,其次,您需要再次使用CAST将该结果转换为XML。这样,您不需要从内容中删除该标题 -
@marc_s 现在我收到此错误:
text/xmldecl not at the beginning of input。另外,请参阅我对问题的更新 -
真是一团糟!您不能将实际的 XML 分成
XML类型的单独列吗?这会让事情简单得多!