Sql 2008,无效字符解析带有波浪号字符的xml

时间:2014-01-10 18:55:13

标签: sql sql-server xml sql-server-2008 html-encode

我正在解析包含'áéñ'等字符的xml文本。

我收到了'在文字内容中找到了无效字符'。错误,像这样

declare @Xml varchar(100)

set @Xml =
'
<?xml version="1.0" encoding="UTF-8"?>
<Root>á</Root>
'

declare @XmlId integer

execute dbo.sp_xml_preparedocument @XmlId output, @Xml

select * from openXml( @XmlId, '/', 2) with (
  Root varchar(10)
)
execute dbo.sp_xml_removedocument @XmlId

我收到以下错误:

The XML parse error 0xc00ce508 occurred on line number 3, near the XML text "<Root>".
Msg 6602, Level 16, State 2, Procedure sp_xml_preparedocument, Line 1
The error description is 'An invalid character was found in text content.'.
Msg 8179, Level 16, State 5, Line 13
Could not find prepared statement with handle 0.
Msg 6607, Level 16, State 3, Procedure sp_xml_removedocument, Line 1
sp_xml_removedocument: The value supplied for parameter number 1 is invalid.

有没有办法让sql解析这个xml?或问题是编码?

是编码这些字符的唯一解决方案还是有更优雅的方法来解决它?

2 个答案:

答案 0 :(得分:3)

我今天得到了同样的错误,将序列化对象作为xml传递给我的商店程序。最终我找到了错误的地方。

更改您的代码:

declare @Xml varchar(100)

要:

declare @Xml nvarchar(100)

以下是我在网上发现的摘要,希望对您有所帮助。

nvarchar列可以存储任何Unicode数据。 varchar列仅限于8位代码页(非Unicode字符数据)。使用nvarchar而不是varchar可以帮助您避免每次读取或写入数据库时​​都进行编码转换。

答案 1 :(得分:-1)

字符á字符对utf-8编码无效。这是任何xml验证器应该告诉你的。解决方案是正确编码。

如果您从其他人那里获取数据,您应该告诉他们他们做错了。如果您生成此数据,则应该解决此问题。假设您处于中间位置,可以为文件编写预处理器,以“修复”无效的XML,然后将其传递给需要有效XML的进程(供应商不愿意或无法提供有效的XML应该避免可能的)

ADDED

您将无法成功说服TSQL解析无法验证的XML。