我使用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显示转义标记:
<span>my field content</span>
而不是
<span>my field content</span>
如何阻止tsql转义标记?
编辑。
注意。在<![CDATA[...]]>
标记周围包装<span>
标记不起作用。 '&lt;'和'&gt;' CDATA的字符也被转义!!
答案 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><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
的值,则 的方式。
您要求的内容可以像这样创建:
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><span>my field content 1</span></Col>
</row>
<row>
<Col><span>my field content 2</span></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
), '<', '<'), '>', '>')
它并不漂亮,但它可以完成这项工作 - 在使用FOR XML
在tsql&amp;中生成HTML表时,我使用这种方法很多这些表的单元格需要保留HTML标记,如跨度等。