экранированные html-теги являются результатом предложения "for xml" - PullRequest
0 голосов
/ 12 марта 2012

Я извлекаю XML из таблицы, используя предложение FOR XML.

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

Некоторые поля содержат HTML-теги (<span> с). В результате на экране XML отображаются экранированные теги:

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

вместо

<span>my field content</span>

Как я могу предотвратить использование тегов tsql?

Редакция. Заметка. Обертывание тега <![CDATA[...]]> вокруг тега <span> не работает. Символы '<' и '>' в CDATA также экранированы !!

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Как я могу предотвратить использование тегов 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>
1 голос
/ 12 марта 2012

Быстрый и грязный способ - вернуть закодированные теги 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 для генерации HTML-таблиц в tsql, и ячейки этих таблиц должны сохранять HTML-теги, такие как span и т. Д.

...