Подтвердить что ты не робот

Как сохранить амперсанд (&) при использовании FOR XML PATH на SQL 2005

Есть ли какие-либо трюки для предотвращения использования SQL Server символов, таких как &, <, и > ? Я пытаюсь вывести URL-адрес в свой XML файл, но SQL хочет заменить любой '&' с '&amp;'

Возьмем следующий запрос:

SELECT 'http://foosite.com/' + RTRIM(li.imageStore)
        + '/ImageStore.dll?id=' + RTRIM(li.imageID)
        + '&raw=1&rev=' + RTRIM(li.imageVersion) AS imageUrl
FROM ListingImages li
FOR XML PATH ('image'), ROOT ('images'), TYPE

Выход, который я получаю, подобен этому (& s разрешено):

<images>
  <image>
    <imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&amp;raw=1&amp;rev=0</imageUrl>
  </image>
</images>

Я бы хотел, чтобы это (& s не было разрешено):

<images>
  <image>
    <imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&raw=1&rev=0</imageUrl>
  </image>
</images>

Как предотвратить использование SQL-сервера SQL & в '&amp;'?

4b9b3361

Ответ 1

То, что генерирует SQL Server, является правильным. То, что вы ожидаете увидеть, - это не правильно сформированный XML. Причина в том, что символ & означает начало ссылки на сущность, например &amp;. Подробнее см. XML-спецификацию.

Когда ваш XML-парсер анализирует эту строку из XML, он поймет ссылки на объекты &amp; и вернет текст в нужную форму, поэтому внутренний формат в XML файле не должен вызывать проблемы, если только вы используете баггический синтаксический анализатор XML или пытаетесь его разобрать вручную (в этом случае ваш текущий код синтаксического анализарования на данный момент фактически не работает в отношении спецификации XML).

Ответ 2

Бывают ситуации, когда человеку может не понадобиться хорошо сформированный XML - тот, с которым я (и, возможно, оригинальный плакат) столкнулся, использовал метод For XML Path для возврата одного списка полей "дочерних" элементов через рекурсивный запрос. Более подробная информация об этом методе приведена здесь (в частности, в разделе "Методы XML в Blackbox" ): Конкатенация значений строк в Transact-SQL

В моей ситуации видение "H & E" (пятно патологии), преобразованное в "хорошо сформированный XML", было настоящим разочарованием. К счастью, я нашел решение... Следующая страница помогла мне решить эту проблему относительно легко и без повторного архивирования рекурсивного запроса или добавления дополнительного синтаксического анализа на уровне презентации (для этого также и для других/будущих ситуаций, когда мой ребенок -словы данных содержат зарезервированные символы XML): Обработка специальных символов с помощью FOR XML PATH


EDIT: приведенный ниже код из опубликованного сообщения в блоге.

select
  stuff(
     (select ', <' + name + '>'
     from sys.databases
     where database_id > 4
     order by name
     for xml path(''), root('MyString'), type
     ).value('/MyString[1]','varchar(max)')
   , 1, 2, '') as namelist;

Ответ 3

Попробуйте это....

select 
  stuff( 
     (select ', <' + name + '>' 
     from sys.databases 
     where database_id > 4 
     order by name 
     for xml path(''), root('MyString'), type 
     ).value('/MyString[1]','varchar(max)') 
   , 1, 2, '') as namelist;