【问题标题】:Sql Server create html tagsSql Server 创建html标签
【发布时间】:2016-08-30 08:48:42
【问题描述】:

我正在从存储过程生成 html,但它会将 html 标签编码为“”或“&”。我在生成标签时需要标签。我已尝试使用 [CDATA],但没有得到预期的结果。

select '<ul class=''downloaditems-grid''>'+(
                select stuff(
                (
                    select  '<li>'+ convert(nvarchar(max),Filepath) +'</li>'
                        from(
                        select ('<p>'+UploadDocumentName+'</p><a target=''_blank'' class=''ml10'' href='''+DocumentFilePath+'''title=''Download''>') As Filepath from table1 CLRD 
                         where                      
                        isnull(CLRD.IsDeleted,0) <> 1   and orderid=2
                 ) 
             as T for xml path('')),1,2,'')) +' </ul>'   a

返回

<ul class='downloaditems-grid'>t;li&gt;&lt;P&gt;bill.png&lt;/&gt;&lt;a target='_blank' class='ml10' href='2c0a7c0c-d228-4f5d-9a8f-eb32911509db.png'title='Download'&gt;&lt;/li&gt; </ul>

但我的要求是:

<ul class='downloaditems-grid'>
<li><p>bill.png</p>
<a target='_blank' class='ml10' href='2c0a7c0c-d228-4f5d-9a8f-eb32911509db.png' title='Download'>
</a>
</li>
</ul>

表结构

除了使用replace我在创建html标签时如何在那里解码之外,任何人都可以提供一些提示吗?

【问题讨论】:

  • 你使用哪种服务器端语言从html访问sql server?为什么不使用那种语言来构建 html?
  • 我正在使用 C#,但我正在存储过程中尝试这个。是的,我可以用 C# 或脚本语言做这件事,但想要在 sp(sql-server) 中。如何防止在 html 查询中编码标签?
  • 您应该(几乎)从不通过连接字符串来创建 XML。如果您的字符串包含禁止字符,您将下地狱。您可能会欺骗,但如果可能的话,您应该正确构建 XML。并且比存储过程更好地使用标量函数。这更容易查询...

标签: html sql sql-server xml tsql


【解决方案1】:

您的“生成的”XML 从多个角度来看是无效的...

使用 SQL Server,您可以像这样轻松创建有效的 XHTML

SELECT 'downloaditems-grid' AS [@class]
      ,'bill.png' AS [li/p]
      ,'_blank' AS [li/a/@target]
      ,'ml10' AS [li/a/@class]
      ,'2c0a7c0c-d228-4f5d-9a8f-eb32911509db.png' AS [li/a/@href]
      ,'Download' AS [li/a/@title]
FOR XML PATH('ul')

结果(似乎与您尝试的结果非常相似

<ul class="downloaditems-grid">
  <li>
    <p>bill.png</p>
    <a target="_blank" class="ml10" href="2c0a7c0c-d228-4f5d-9a8f-eb32911509db.png" title="Download" />
  </li>
</ul>

请注意,HTML 很脏,并且与 XHTML 完全不同

简短说明:

XML 中,标签和属性名称与内容之间有明显的区别。某些字符是绝对禁止的,原因很明确(&lt;, &gt; and &amp; 和许多特殊字符结合字符串编码会导致意外结果。标签和属性有明确记录的限制。内容可以是任何东西,但是:内容将永远需要正确的转义,因此您的禁止字符转换为 xml 实体

CDATA 不会为您提供帮助,因为 FOR XML PATH 不支持它(尽管有 EXPLICIT...),无论如何,CDATA 不会解决您的问题,即使它有效...

您连接的 xml 字符串在许多方面都无效(例如 &lt;/&gt; 或缺少空白...)

UPDATE 与表数据一起使用

这是将其与表数据一起使用的代码。请注意,我在第 3 行添加了禁用字符!

DECLARE @tbl TABLE(DocumentFilePath VARCHAR(100),UploadDocumentName VARCHAR(100));
INSERT INTO @tbl VALUES
 ('File1.png','This is file 1')
,('File2.png','This is file 2')
,('File&3.png','This is file 3& with forbidden <>!!')

SELECT 'downloaditems-grid' AS [@class]
      ,(
        SELECT
           'bill.png' AS [p]
          ,'_blank' AS [a/@target]
          ,'ml10' AS [a/@class]
          ,tbl.DocumentFilePath AS [a/@href]
          ,tbl.UploadDocumentName AS [a/@title]
      FROM @tbl AS tbl
      FOR XML PATH('li'),TYPE
       )
FOR XML PATH('ul')

这是结果

<ul class="downloaditems-grid">
  <li>
    <p>bill.png</p>
    <a target="_blank" class="ml10" href="File1.png" title="This is file 1" />
  </li>
  <li>
    <p>bill.png</p>
    <a target="_blank" class="ml10" href="File2.png" title="This is file 2" />
  </li>
  <li>
    <p>bill.png</p>
    <a target="_blank" class="ml10" href="File&amp;3.png" title="This is file 3&amp; with forbidden &lt;&gt;!!" />
  </li>
</ul>

【讨论】:

  • 一定要调查FOR XML——它会为您完成所有转义,而 SQL Server 只是没有能力通过字符串操作来正确处理。手动尝试逃避角色没有任何价值。 IIRC 在 HTML 和 XML 转义方面存在差异(可能是撇号?),这可能是邪恶的......
  • @SteveCooper 这真的是对我的回答的评论吗?
  • @Shnugo 我的表有多个结果(多个
  • )。那时我如何用 xhtml 管理这个
  • 是的,我要去:)
  • 【解决方案2】:

    你好,你的代码使用这个:

    replace( replace( @body, '&lt;', '<' ), '&gt;', '>' )
    

    【讨论】:

    • 是的,这是替换这些的方法,但我正在尝试寻找另一种解决方案。当查询返回多个 html 编码字符时,这将失败。那么我们将使用多少次替换关键字。
    【解决方案3】:

    首先,您的标记是错误的。应该是'&lt;P&gt;'+UploadDocumentName+'&lt;/P&gt;&lt;a target=''_blank'' class=''ml10'' href='''+DocumentFilePath+''' title=''Download''/&gt;' 使用常规 XML 构建功能

        select        
           [ul/@class]='downloaditems-grid',
           [ul]=(
           select [P]=UploadDocumentName,
                    [a/@target]='_blank',
                    [a/@class] ='ml10',
                    [a/@href]=DocumentFilePath,
                    [a/@title]='Download' 
           from ( 
                  -- sample data
                  values
                   ('123','ad/df')
                  ,('456','xx/yy')
                ) CLRD (UploadDocumentName, DocumentFilePath)
           for xml path('li'), type
           )
    for xml path('')      
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签