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


524

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

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

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


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

Ответы:


422

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

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


195

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

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

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


3
Это было совершенно разумно при публикации, но изменения (или, возможно, разъяснения) в вопросе с тех пор сделали его бессмысленным как ответ. С одной стороны, цитируемый отрывок больше не присутствует в вопросе.
Марк Эми

133

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


5
Я действительно предпочитаю это решение! Также должно быть возможно использовать шестнадцатеричное обозначение:&
CodeManX

2
Логично, почему это будет работать? Обе строки имеют амперсанд, включая
строку

4
@sijpkes Поскольку амперсанд здесь сообщает синтаксическому анализатору, что следующие символы используются для представления другого символа, который в этом случае будет амперсандом. Амперсанд не является «нелегальным» в XML - он просто имеет особое значение. Это означает, что «все символы после этого, пока вы не нажмете точку с запятой, должны быть переведены на что-то другое». Когда у вас есть амперсанд, как правило, без описательных символов и конечной точки с запятой, анализатор запутывается.
Райли Майор

1
Это ответ для меня. Добавление & # 038; в Расположение моего заголовка ответа исправил его и не показывает амперсанд на заголовке ответа. : D
Iamjoshua

Переполнение стека это так здорово. Вот почти 11-летний пост, который решает мою проблему. И это было просмотрено более 690 000 раз.
Билл

69

Используйте CDATAтеги:

 <![CDATA[
   This is some text with ampersands & other funny characters. >>
 ]]>

4
Это предположение, а не ответ.
Брайан Оукли

10
Это может быть предположение; это правильно, хотя. Маркеры CDATA позволяют использовать необработанные амперсанды.
Квентин

19
В оригинальном сообщении никогда не указывалось, где должен использоваться тег &, теги CDATA не могут использоваться для значений атрибутов, а только для фактического содержимого тегов, поэтому я добавил символ «?».
скраг

1
Это также отлично подходит для характеристики данных XML, и этот ответ полезен во многих других сценариях, связанных с отображением XML. Для меня это действительно помогло в Camel XML DSL, когда мне нужно было установить тело или какой-либо заголовок с некоторыми данными XML, анализатор Camel XML игнорировал содержимое CDATA, считывая их как поток символов. Без этого верблюжий двигатель
генерирует

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


11

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

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


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

6

Я пробовал & amp, но это не сработало. Основываясь на ответе Вим тен Бринка, я попытался - и это сработало.

Один из моих коллег-разработчиков предложил мне использовать & # x26; и это работало независимо от того, сколько раз это может быть оказано.


5

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

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

&amp;amp;

Для более подробного объяснения кодировки XML см .:

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


4

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text> сделает свое дело.


3

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


1
\uЭкранирование не имеет никакого особого значения в XML вообще. -1.
Марк Эмери

@MarkAmery Да, у них нет особого значения, именно поэтому они так хорошо работают - нечего интерпретировать, поэтому нет ничего плохого. Java интерпретирует Unicode и отображает амперсанд так, как хочет OP.
Скотт Биггс

1
@ScottBiggs Что Java делать с вопросом ОП?
Филипп-Андре Лорин

1
@ScottBiggs Так что это не по теме. - 1.
Филипп-Андре Лорин

1
@ScottBiggs Тот факт, что это работает для вас, и что некоторые другие могут извлечь выгоду, не имеет значения; Ваш ответ - шум для всех остальных читателей. Потому что это не касается более общего случая, о котором спрашивал ОП. Это не о том, чтобы не делиться своим успехом. Речь идет о том, чтобы держать его там, где он принадлежит. Ваш вклад может быть полезен, но не представлен здесь как ответ. Может быть, как комментарий, может быть, как ответ на другой вопрос (который вы можете создать сами и ответить на него).
Филипп-Андре Лорин

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>

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


2
Я думаю, что это основание было хорошо освещено за 7 лет до публикации этого ответа.
miken32
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.