2012-03-12 39 views
0

我使用FOR XML子句从表中提取XML。从“for xml”子句导致的转义html标记

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逃脱标签?

EDITED。 注意。围绕<span>标签包装<![CDATA[...]]>标签不会完成这项工作。 CDATA的'<'和'>'字符也会被转义!

回答

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中提取它们时,您将得到正确的值。在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> 
+0

这伟大的工作。谢谢。 – 2012-03-12 15:03:11

1

快速和肮脏的方法是把编码的HTML标签回你有完整的XML后:

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中生成HTML表格&这些表格的单元格需要保留HTML标记,例如跨度等。