Как избежать амперсандов в XML, чтобы они отображались как объекты в HTML?

424

У меня есть XML-текст, который я хочу отобразить на странице HTML. Этот текст содержит амперсанд, который я хочу отобразить в представлении его сущности: &.

Как избежать этого амперсанда в исходном XML? Я пробовал &, но он декодируется как фактический символ амперсанда (&), который недействителен в HTML.

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

  • 0
    В последней редакции этого вопроса утверждается, что «фактический символ амперсанда (&) ... недопустим в HTML». ложно Действительно, даже принятый ответ на связанный вопрос, представленный в качестве обоснования, гласит: «HTML5 позволяет оставить его без экранирования, но только в том случае, если последующие данные не похожи на действительную ссылку на символ» .
Теги:

12 ответов

368
Лучший ответ

Когда ваш XML содержит &, это приведет к тексту &.

Когда вы используете это в HTML, это будет отображаться как &.

172

Согласно §2.4 спецификации XML 1.0, вы должны иметь возможность использовать & ,

Я пробовал & но это не разрешено.

Вы уверены, что это не другая проблема? XML явно определяет это как способ избежать амперсандов.

  • 1
    Это было совершенно разумно при публикации, но изменения (или, возможно, разъяснения) в вопросе с тех пор сделали его бессмысленным в качестве ответа. С одной стороны, цитируемый отрывок больше не присутствует в вопросе.
  • 0
    Версия ссылки устарела. Вместо этого зайдите сюда: w3.org/TR/xml/#syntax
101

Символ & сам по себе является escape-символом в XML, поэтому решение состоит в том, чтобы объединить его и десятичный эквивалент Unicode для & тем самым гарантируя отсутствие ошибок синтаксического анализа XML. То есть, замените символ & & ,

  • 4
    Я действительно предпочитаю это решение! Также должно быть возможно использовать шестнадцатеричное обозначение: &
  • 1
    Логично, почему это будет работать? Обе строки имеют амперсанд, в том числе и тот, в конце которого находится символьный код ...
Показать ещё 2 комментария
58

Знаки CDATA?

     <![CDATA[
       This is some text with ampersands & other funny characters. >>
     ]]>
  • 3
    Это предположение, а не ответ.
  • 9
    Это может быть предположение; это правильно, хотя. Маркеры CDATA позволяют использовать необработанные амперсанды.
Показать ещё 3 комментария
40

&amp; должен работать отлично, Wikipedia имеет Список предопределенных сущностей в XML.

9

В моем случае мне пришлось изменить его на %26.

Мне нужно было избежать & в URL-адресе. Так что &amp; не сработало для меня. Функция urlencode изменяет & на %26. Таким образом, ни XML, ни механизм URL-адреса браузера не жаловались на URL-адрес.

  • 5
    Да. Обратите внимание на то, что OP был об экранировании в XML. Выход из URL - это другая проблема. Настоящее веселье начинается, когда у вас есть URL-адреса в XML или XML-фрагменты в URL-адресах ...
4

Я пробовал & amp, но это не сработало. Основываясь на ответе Wim ten Brink, я попробовал и amp; amp, и это сработало.

One of my fellow developers suggested me to use &#x26; and that worked regardless of how many times it may be rendered.

3

&amp; - это способ представления амперсанда в большинстве разделов XML-документа.

Если вы хотите, чтобы XML отображался в HTML, вам нужно сначала создать правильно закодированный XML (который включает в себя изменение & до &amp;), а затем использовать его для создания правильно закодированного HTML (который включает в себя повторное изменение & до &amp;). Это приводит к:

&amp;amp;

Более подробное объяснение XML-кодирования см. в разделе

Какие символы мне нужно выполнить в документах XML?

2

Как насчет использования юникода \u0026? Работает для меня в моих XML файлах Android. Если возникают проблемы, кто-то сообщил мне.

  • 1
    \u экранирование не имеет никакого особого значения в XML вообще. -1.
  • 0
    @MarkAmery Да, у них нет особого значения, именно поэтому они так хорошо работают - нечего интерпретировать, поэтому нет ничего плохого. Java интерпретирует Unicode и отображает амперсанд так, как хочет OP.
Показать ещё 6 комментариев
2

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text> выполнит трюк.

0

Связанная проблема заключается в том, как кодировать содержимое элемента XML, когда такой контент содержит амперсанд - если XML является частью URI, представленной с действием GET. (Оставив в стороне мудрость такого API-интерфейса, с этим мне пришлось столкнуться сегодня.) Я попробовал все, что упоминалось выше, и единственное, что действительно работало, было %26amp;. %26 был необходим для URL-кодирования первый символ в XML-кодировке для амперсанда. amp;, следующий за %26, был необходим, поскольку XML-часть URI загружалась в сервер XML-документа. Поэтому в этом забавном сценарии необходимо было скреплять обе методологии кодирования вместе.

0

Посмотрите, как выглядит ваш XML ниже.

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES<>'GCF'
  <Query>
</Employees>

Вы не можете использовать <> напрямую, поскольку он выдает ошибку. В этом случае вы можете использовать &#60;&#62; взамен этого.

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES &#60;&#62; 'GCF'
  <Query>
</Employees>

Нажмите здесь, чтобы просмотреть все коды.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню