我正在解析包含'áéñ'等字符的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?或问题是编码?
是编码这些字符的唯一解决方案还是有更优雅的方法来解决它?
答案 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。