修复XML解析的技巧:非法限定名称字符

时间:2014-12-29 09:33:11

标签: sql xml tsql sql-server-2012

是否有解决以下错误的最终解决方案:

  

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功能?

1 个答案:

答案 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

http://en.wikipedia.org/wiki/Valid_characters_in_XML

http://en.wikipedia.org/wiki/C0_and_C1_control_codes