【问题标题】:XML parsing, illegal character in the end of the stringXML解析,字符串末尾有非法字符
【发布时间】: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 类型的单独列吗?这会让事情简单得多!

标签: tsql sql-server-2008-r2


【解决方案1】:

您可以尝试将原始编码从 UTF-16 更改为 ISO-8859-1,或更精确的字符编码:

DECLARE @data varchar(max) = '<?xml version="1.0" encoding="utf-16"?><...>' 
SELECT CAST(REPLACE(@data, 
            '<?xml version="1.0" encoding="utf-16"?>',
            '<?xml version="1.0" encoding="iso-8859-1"?>') AS XML) ResponseData

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多