首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML解析sql server中的非法字符

XML解析sql server中的非法字符
EN

Stack Overflow用户
提问于 2019-02-14 14:49:18
回答 1查看 7.3K关注 0票数 2

当将表记录解析为xml时,我会遇到一个illegal xml character错误。

代码语言:javascript
复制
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')

代码语言:javascript
复制
SELECT CONVERT(XML,'lift')

描述的记录如下:

舒缓™由西利可调底座是简单的方式,使您的床成为完美的地方放松。无线遥控器控制着头部和腿部的升降,几乎不受人体工学位置的限制。“

以上并不是对xml的解析。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-14 15:53:55

这是因为XML标准中有一个已知的illegal字符列表。大多数情况下,这些字符甚至是不可见的,例如“终端钟”,或CHAR(7)。该字符和列表中的其他字符将导致您现在遇到的错误。

几乎没有解决办法,但所有这些方法都是关于清除非法字符。

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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的对话,在本链接主题中也有介绍:TSQL "Illegal XML Character" When Converting Varbinary to XML

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54693134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档