2012-03-12 17 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標記,例如跨度等。