Используйте амперсанд в CAST в SQL - PullRequest
3 голосов
/ 13 июля 2009

Следующий фрагмент кода на SQL Server 2005 завершается ошибкой с амперсандом '&':

select cast('<name>Spolsky & Atwood</name>' as xml)

Кто-нибудь знает обходной путь?

Более подробное объяснение. Мне нужно обновить некоторые данные в столбце XML, и я использую хак типа поиска и замены, приведя значение XML к varchar, выполняя замену и обновляя столбец XML с помощью этого преобразования.

Ответы [ 5 ]

6 голосов
/ 13 июля 2009

Это недопустимый XML. Используйте &amp;:

select cast('<name>Spolsky &amp; Atwood</name>' as xml)
5 голосов
/ 13 июля 2009
select cast('<name>Spolsky &amp; Atwood</name>' as xml)

Буквальный амперсанд внутри тега XML не разрешен стандартом XML, и такой документ не сможет быть проанализирован любым анализатором XML.

XMLSerializer() выведет кодированный амперсандом HTML.

Следующий код:

using System.Xml.Serialization;

namespace xml
{
    public class MyData
    {
        public string name = "Spolsky & Atwood";
    }

    class Program
    {
        static void Main(string[] args)
        {
            new XmlSerializer(typeof(MyData)).Serialize(System.Console.Out, new MyData());
        }
    }
}

выведет следующее:

<?xml version="1.0" encoding="utf-8"?>
<MyData
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <name>Spolsky &amp; Atwood</name>
</MyData>

, с &amp; вместо &.

3 голосов
/ 24 августа 2010

При работе с XML в SQL вам гораздо безопаснее использовать встроенные функции, а не преобразовывать их вручную.

Следующий код создаст правильную переменную SQL XML, которая будет выглядеть как ваш желаемый вывод на основе необработанной строки:

DECLARE @ExampleString nvarchar(40)
    , @ExampleXml xml

SELECT  @ExampleString = N'Spolsky & Atwood'

SELECT  @ExampleXml =
    (
        SELECT  'Spolsky & Atwood' AS 'name'
        FOR XML PATH (''), TYPE
    )

SELECT  @ExampleString , @ExampleXml
3 голосов
/ 13 июля 2009

Вам также нужно, чтобы XML экранировал текст.

Итак, давайте вернемся и предположим, что вы строите эту строку как:

SELECT '<name>' + MyColumn + '</name>' FROM MyTable

вы бы хотели сделать что-то вроде:

SELECT '<name>' + REPLACE( MyColumn, '&', '&amp;' ) + '</name>' FROM MyTable

Конечно, вы, вероятно, должны обслуживать другие организации таким образом:

SELECT '<name>' + REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( MyColumn, '&', '&amp;' ), '''', '&apos;' ), '"', '&quot;' ), '<', '&lt;' ), '>', '&gt;' ) + '</name>' FROM MyTable
0 голосов
/ 13 июля 2009

Как утверждают Джон и Кассной, & само по себе недопустимо. Это потому, что символ амперсанда является началом символьной сущности - используется для указания символов, которые не могут быть представлены буквально. Существует две формы сущности: одна задает символ по имени (например, &amp; или &quot;), а другая задает символ по его коду (я считаю, что это позиция кода в наборе символов Unicode, но не конечно, например, &#34; должен представлять двойную кавычку).

Таким образом, чтобы включить литерал & в документ HTML, необходимо указать его сущность: &amp;. Другие распространенные из них: &lt; для <, &gt; для > и &quot; для ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...