sql server中XML解析非法字符

San*_*hah 2 xml sql sql-server stored-procedures

illegal xml character将表记录解析为 xml 时出现错误。

\n
SELECT \n    mb.ProductTitle,mb.ProductDescription,\n    CAST((\n        SELECT\n            Id,                             \n            ProductDescription,\n        FROM ProductsManagement AS mpm\n        WHERE mpm.MattressId = 6\n        FOR XML PATH('ProductItemListModel'), \n        ROOT('MattressBarndProductItemList'))as XML)\nFROM Brands AS mb\nWHERE mb.Id = 6\nFOR XML PATH(''), ROOT('ProductModel')\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
SELECT CONVERT(XML,'lift')\n
Run Code Online (Sandbox Code Playgroud)\n

描述记录如下:

\n
\n

Sealy 的 Ease\xe2\x84\xa2 可调节底座是让您的床变成完美放松场所的简单方法。无线遥控器控制头部和腿部抬起,几乎可以实现无限范围的人体工学姿势。”

\n
\n

上面没有解析成xml。

\n

Ale*_*lok 5

这是因为XML 标准中有一个已知非法字符的列表。大多数情况下,这些字符甚至是不可见的,例如“终端铃声”或 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
Run Code Online (Sandbox Code Playgroud)

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

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')
Run Code Online (Sandbox Code Playgroud)

另一种方法是与 VARBINARY 的对话,并在此链接主题中进行了描述: TSQL "Illegal XML Character" When Converting Varbinary to XML