是否有解决以下错误的最终解决方案:
Msg 9455,Level 16,State 1,Line 8
XML解析:第1行,第12个字符,非法限定名称字符
在转换"非法"时引发NVARCHAR
字符串XML
。
例如:
DECLARE @Text NVARCHAR(MAX)
SET @Text = '<tag>' + 'Test <' + '</tag>'
SELECT CAST(@Text AS XML)
可以使用CDATA
修复,但它只处理几个符号。在以下查询的情况下:
DECLARE @Text NVARCHAR(MAX)
SET @Text = '<tag><![CDATA[' + 'Test' + CHAR(28) + ']]></tag>' -- CHAR(28) --CHAR(8) -- CHAR(29) -- CHAR(63)
SELECT CAST(@Text AS XML)
它什么都不做。此外,它不能在XML属性值中使用。
我试图找到一个包含所有破坏XML的符号的列表,但我无法做到。所以每次有一些符号打破XML我发现并替换它,但这是非常临时的,很难维护解决方案。
对于此类情况是否有完整的解决方案 - 无论是应该在应用程序中还是使用CLR功能?
答案 0 :(得分:3)
这取决于XML版本,但为了更安全,您可以做的一件事是在循环中替换所有C0控制ASCII字符:
DECLARE @counter INT=0
DECLARE @Text NVARCHAR(MAX)
SET @Text = '<tag><![CDATA[' + 'Test' + CHAR(28) + CHAR(55) + CHAR(29) + '<' + ']]></tag>' -- CHAR(28) --CHAR(8) -- CHAR(29) -- CHAR(63)
WHILE @counter<32
BEGIN
SET @text= REPLACE(@text,CHAR(@counter),'?')
SET @counter=@counter+1
END
SELECT CAST(@Text AS XML)
有关XML char set的更多信息:
http://www.w3.org/TR/xml11/#charsets