Sql Server 创建html标签

Nee*_*rma 2 html xml sql t-sql sql-server

我正在从存储过程生成 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
Run Code Online (Sandbox Code Playgroud)

它返回

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

但我的要求是:

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

表结构

在此处输入图片说明

除了在创建 html 标签时使用替换我在那里解码的方式之外,任何人都可以给出一些提示吗?

Shn*_*ugo 5

从几个角度来看,您“生成的”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')
Run Code Online (Sandbox Code Playgroud)

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

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

并意识到一个HTML是肮脏与 XHTML 完全不同

简短说明:

XML有标记和属性名称和内容之间的清晰分离。出于明确的原因,绝对禁止某些字符(<, > and &并且许多特殊字符与字符串编码结合会导致意外结果。标签和属性有明确记录的限制。内容可以是任何内容,但是:内容永远需要正确转义,因此,您的禁用字符被转换为 xml 实体

CDATA不会帮助你,因为它不支持FOR XML PATH(虽然有EXPLICIT......),无论如何CDATA,即使它有效......也不会解决你的问题......

从许多角度来看,您连接的 xml 字符串都是无效的(例如</>或缺少空白...)

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

这是结果

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