2014-01-10 44 views
2

我正在解析一个xml文本,其中包含像'áéñ'这样的字符。Sql 2008,无效字符解析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?或者问题是编码?

是对这些字符进行编码的唯一解决方案还是有更好的方法来解决它?

回答

-1

字符á字符不是UTF-8编码的有效有效字符。这是任何XML验证器应该告诉你的。解决方案是正确编码。

如果您从其他人处获取数据,您应该告诉他们他们做错了。如果你生成这些数据,你应该解决这个问题。假设你被困在中间,有可能为该文件编写一个预处理器,用于“修复”无效的XML,然后将其交给需要有效XML的进程(供应商不愿意或无法提供有效的XML时应该避免可能的话)

ADDED

你会在一个追求成功说服TSQL解析XML将无法验证。

2

今天我得到了同样的错误,将序列化对象作为xml传递给我的存储过程。最终我发现错误在哪里。

declare @Xml varchar(100) 

要:

从改变你的代码

declare @Xml nvarchar(100) 

下面是总结我在网上找到,希望能帮助你。

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

+0

打印出你的@Xml,你应该看到这个 – Paparazzi