代码之家  ›  专栏  ›  技术社区  ›  Steve -Cutter- Blades

带CDATA的SQL Server XML输出

  •  6
  • Steve -Cutter- Blades  · 技术社区  · 17 年前

    有没有办法让SQL Server XML返回使用CDATA?SQL Server返回的XML如下所示:

    <locations>
        <site id="124">
            <sitename>Texas A &amp; M</sitename>
        </site>
    </locations>
    

    当我被要求具备以下条件时:

    <locations>
        <site id="124">
            <sitename><![CDATA[Texas A & M]]></sitename>
        </site>
    </locations>
    
    3 回复  |  直到 17 年前
        1
  •  16
  •   T.S.    11 年前

    看看这些选项 FOR XML EXPLICIT (参数 指示 )。它提供了更大程度的控制,您还可以指定CDATA。这是 a good tutorial .

    declare @agent table
    (    
        AgentID int,
        Fname varchar(5),
        SSN varchar(11)
    )
    
    insert into @agent
    select 1, 'Vimal', '123-23-4521' union all
    select 2, 'Jacob', '321-52-4562' union all
    select 3, 'Tom', '252-52-4563'
    
    SELECT
        1 AS Tag,
        NULL AS Parent,
        NULL AS 'Agents!1!',
        NULL AS 'Agent!2!AgentID',
        NULL AS 'Agent!2!Fname!Element',
        NULL AS 'Agent!2!SSN!cdata'
    UNION ALL
    SELECT
        2 AS Tag,
        1 AS Parent,
        NULL, 
        AgentID,
        Fname,
        SSN
    FROM @agent
    FOR XML EXPLICIT
    
        2
  •  1
  •   rasx    16 年前

    以下是我获取CDATA的一个示例:

    DECLARE @GlobalDateFormat varchar(32)
    SET @GlobalDateFormat = 'MM/dd/yyyy hh:mm tt'
    
    DECLARE @xml XML
    
    SET @xml = 
    (
        SELECT
                SegmentId         = ISNULL(SegmentId,0)
            ,   DocumentId        = ISNULL(DocumentId,0)
            ,   Title             = CAST(Core.dbo.fCharFormat('xmlCDATA',Title,DEFAULT,'') AS xml)
            ,   DocumentShortName = CAST(Core.dbo.fCharFormat('xmlCDATA',DocumentShortName,DEFAULT,'') AS xml)
            ,   [FileName]        = CAST(Core.dbo.fCharFormat('xmlCDATA',[FileName],DEFAULT,'') AS xml)
            ,   [Path]            = CAST(Core.dbo.fCharFormat('xmlCDATA',[Path],DEFAULT,'') AS xml)
            ,   CreateDate        = ISNULL(Core.dbo.fDateFormat(@GlobalDateFormat,CreateDate),Core.dbo.fDateFormat(@GlobalDateFormat,GETDATE()))
            ,   ModificationDate  = ISNULL(Core.dbo.fDateFormat(@GlobalDateFormat,ModificationDate),Core.dbo.fDateFormat(@GlobalDateFormat,GETDATE()))
            ,   TemplateId        = ISNULL(CAST(TemplateId AS varchar(16)),'')
            ,   IsRoot            = ISNULL(IsRoot,0)
            ,   IsActive          = ISNULL(IsActive,0)
            ,   SortOrdinal       = ISNULL(CAST(SortOrdinal AS varchar(16)),'')
            ,   ClientId          = ISNULL(ClientId,'')
            ,   Tag               = CAST(Core.dbo.fCharFormat('xmlCDATA',Tag,DEFAULT,'') AS xml)
            FROM
                Document
            WHERE
                DocumentId = 9073
            FOR XML AUTO, ELEMENTS
    )
    
    SELECT @xml
    

    以下是我的黄鼠狼式CDATA处理功能的相关细节:

    IF @cmdName = 'xmlCDATA'
    BEGIN
        IF @chars IS NULL
        BEGIN
            SET @charsOut = @charsDefault
        END
        ELSE
        BEGIN
            SET @chars = REPLACE(@chars,'<![CDATA[','')
            SET @chars = REPLACE(@chars,']]>','')
            SET @charsOut = '<![CDATA[' + @chars + ']]>'
        END
    END
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    正如Joel在上面的评论中提到的,这两种形式的含义应该完全相同。但是,如果确实需要CDATA表单,那么您可以编写一个后处理器,将第一个表单作为输入,并使用CDATA输出第二个表单。

    不编码 XML以第一种形式转义数据,并使用与CDATA兼容的方法对其重新编码。看到问题了吗 Is there a way to escape a CDATA end token in xml? 有关CDATA转义的注意事项。