【问题标题】:Technique for fixing XML parsing: illegal qualified name character修复 XML 解析的技术:非法的限定名称字符
【发布时间】:2015-02-25 11:48:00
【问题描述】:

是否有修复以下错误的终极解决方案:

消息 9455,第 16 层,状态 1,第 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 函数?

【问题讨论】:

    标签: sql xml tsql sql-server-2012


    【解决方案1】:

    这取决于 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 字符集的更多信息:

    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

    【讨论】:

    • 我检查了一些C0 控制字符不会破坏XML 转换。我想那是因为您所指的 XML 版本 - 是否有参考显示每个版本中允许哪些控件?
    • 上面的第二个链接显示了 XML 1.0 和 XML 1.1 的有效 unicode 值列表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多