在SQL Server中XML解析非法字符

时间:2019-02-14 14:49:19

标签: sql sql-server xml stored-procedures

将表记录解析为xml时遇到illegal xml character错误。

SELECT 
                    mb.ProductTitle,mb.ProductDescription,
                    CAST((
                        SELECT
                            Id,                             
                            ProductDescription,
                        FROM ProductsManagement AS mpm
                        WHERE mpm.MattressId = 6
                        FOR XML PATH('ProductItemListModel'), ROOT('MattressBarndProductItemList'))as XML)
                FROM Brands AS mb
                WHERE mb.Id = 6
                FOR XML PATH(''), ROOT('ProductModel')

SELECT CONVERT(XML,'lift')

描述记录如下:

  

Ease™by Sealy可调式底座是将您的床变成放松的理想场所的简单方法。无线遥控器可控制头部和腿部抬高,几乎无限范围地符合人体工程学。”

上面没有解析为xml。

1 个答案:

答案 0 :(得分:2)

这是因为XML标准中存在已知的illegal字符列表。通常,这些字符甚至都不可见,例如“终端铃”或CHAR(7)。此类字符以及列表中的其他字符会导致您现在遇到该错误。

可用的解决方法很少,但是所有解决方法都是关于删除非法字符的。

下面的示例基于标量函数方法,因此警告::它可能对大量数据执行缓慢:

CREATE FUNCTION [dbo].RemoveInvalidXMLCharacters (@InputString VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
    IF @InputString IS NOT NULL
    BEGIN
      DECLARE @Counter INT, @TestString NVARCHAR(40)

      SET @TestString = '%[' + NCHAR(0) + NCHAR(1) + NCHAR(2) + NCHAR(3) + NCHAR(4) + NCHAR(5) + NCHAR(6) + NCHAR(7) + NCHAR(8) + NCHAR(11) + NCHAR(12) + NCHAR(14) + NCHAR(15) + NCHAR(16) + NCHAR(17) + NCHAR(18) + NCHAR(19) + NCHAR(20) + NCHAR(21) + NCHAR(22) + NCHAR(23) + NCHAR(24) + NCHAR(25) + NCHAR(26) + NCHAR(27) + NCHAR(28) + NCHAR(29) + NCHAR(30) + NCHAR(31) + ']%'

      SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)

      WHILE @Counter <> 0
      BEGIN
        SELECT @InputString = STUFF(@InputString, @Counter, 1, ' ')
        SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)
      END
    END
    RETURN(@InputString)
END

因此,调整后的查询将类似于:

SELECT 
    [dbo].RemoveInvalidXMLCharacter(smb.ProductTitle) as ProductTitle
,   [dbo].RemoveInvalidXMLCharacter(mb.ProductDescription) as ProductDescription
,    CAST((
        SELECT
            Id,                             
            [dbo].RemoveInvalidXMLCharacter(ProductDescription) ProductDescription
        FROM ProductsManagement AS mpm
        WHERE mpm.MattressId = 6
        FOR XML PATH('ProductItemListModel'), ROOT('MattressBarndProductItemList'))as XML)
FROM Brands AS mb
WHERE mb.Id = 6
FOR XML PATH(''), ROOT('ProductModel')

另一种方法是与VARBINARY的对话,并且在此链接的主题中也有介绍: Invalid Characters in XML