转义的html标签来自“for xml”子句

时间:2012-03-12 13:38:30

标签: xml tsql tags escaping

我使用FOR XML子句从表中提取XML。

select
    maincode as cod_deal
    , catcode as cod_category
    , catname as title_category
        ...
from myTable
for xml raw, elements

某些字段包含HTML标记(<span> s)。生成的XML显示转义标记:

&lt;span&gt;my field content&lt;/span&gt;

而不是

<span>my field content</span>

如何阻止tsql转义标记?

编辑。 注意。在<![CDATA[...]]>标记周围包装<span>标记不起作用。 '&lt;'和'&gt;' CDATA的字符也被转义!!

2 个答案:

答案 0 :(得分:3)

  

如何阻止tsql转义标记?

我不完全确定这是你想要的。但...

示例数据:

declare @T table
(
  Col varchar(50)
)

insert into @T values ('<span>my field content 1</span>')
insert into @T values ('<span>my field content 2</span>')

相当于您对此表的查询:

select Col
from @T
for xml raw, elements, type

此结果将是一行和一列,其中包含如下所示的XML文档:

<row>
  <Col>&lt;span&gt;my field content 1&lt;/span&gt;</Col>
</row>
<row>
  <Col>&lt;span&gt;my field content 2&lt;/span&gt;</Col>
</row>

如果您希望<span>my field content 1</span>成为元素col,则 的方式。

您要求的内容可以像这样创建:

select cast(Col as xml) as Col
from @T
for xml raw, elements, type

这也将返回一行,其中包含一个XML列:

<row>
  <Col>
    <span>my field content 1</span>
  </Col>
</row>
<row>
  <Col>
    <span>my field content 2</span>
  </Col>
</row>

在这里,您<span>my field content 1</span>作为子节点Col而不是值。

如果您对XML进行了转义,那么当您从XML中提取XML时,您将获得正确的值。在TSQL中有这样的东西,但应该在其他语言中是相同的。

declare @X xml
set @X = 
'<row>
  <Col>&lt;span&gt;my field content 1&lt;/span&gt;</Col>
</row>
<row>
  <Col>&lt;span&gt;my field content 2&lt;/span&gt;</Col>
</row>'

select T.N.value('Col[1]', 'varchar(50)') as Col
from @X.nodes('/row') as T(N)

结果:

Col
--------------------------------------------------
<span>my field content 1</span>
<span>my field content 2</span>

答案 1 :(得分:1)

快速而肮脏的方法是在完成XML后将编码的HTML标记放回:

SELECT  REPLACE(REPLACE(( SELECT    maincode AS cod_deal ,
                                    catcode AS cod_category ,
                                    catname AS title_category
                          FROM      myTable
                        FOR
                          XML RAW ,
                              ELEMENTS
                        ), '&lt;', '<'), '&gt;', '>') 

它并不漂亮,但它可以完成这项工作 - 在使用FOR XML在tsql&amp;中生成HTML表时,我使用这种方法很多这些表的单元格需要保留HTML标记,如跨度等。