Як я можу уникнути розширень у XML, щоб вони відображалися як сутності в HTML?


523

У мене є текст XML, який я хочу візуалізувати на HTML-сторінці. Цей текст містить амперсанд, який я хочу зробити в своїй суті уявлення: &.

Як уникнути цієї амперсанди у вихідному XML? Я спробував &, але це розшифровується як власне символ амперсанда ( &), який недійсний у HTML .

Тому я хочу уникнути цього таким чином, що він буде відображатися, як &на веб-сторінці, яка використовує вихід XML.


1
В останній редакції цього питання стверджується, що "фактичний символ амперсанда (&) ... недійсний у HTML". неправдиво. Дійсно, навіть прийнята відповідь на пов’язане запитання, подане як обгрунтування, зазначає, що "HTML5 дозволяє залишити його без нагляду, але лише тоді, коли наведені нижче дані не виглядають як дійсні посилання символів" .
Марк Амері

Відповіді:


422

Коли ваш XML містить &, це призведе до тексту &.

Якщо ви використовуєте це в HTML, це буде надано як &.


195

Згідно з §2.4 специфікації XML 1.0 ви повинні мати можливість використовувати &.

Я спробував & amp; але це не дозволено.

Ви впевнені, що це не інше питання? XML чітко визначає це як спосіб уникнути розширень.


3
Це було цілком розумним при опублікуванні, але зміни (або, можливо, уточнення) питання, оскільки зробили це безглуздим як відповідь. З одного боку, цитований уривок вже не присутній у питанні.
Марк Амері

132

&Персонаж сам по собі є маскуючий в XML , тому рішення об'єднати її та десяткову Unicode еквівалент , &таким чином , гарантуючи , що немає XML розбору помилок. Тобто замініть персонаж &на &.


5
Я дуже віддаю перевагу цьому рішенню! Також має бути можливість використовувати шістнадцяткову нотацію:&
CodeManX

2
Логічно, навіщо це працювати? В обох рядках є амперсанд, в тому числі і той, що в кінці символьного коду ...
sijpkes

4
@sijpkes Оскільки амперсанд тут повідомляє аналізатору, що наступні символи використовуються для представлення іншого символу, який у цьому випадку буде амперсандом. Амперсанд не є "незаконним" у XML-- він просто має особливе значення. Це означає, що "всі символи після цього, поки ви не потрапите на крапку з комою, повинні бути переведені на щось інше". Коли у вас є ампер і нормально, без описових символів і крапки з комою, аналізатор плутається.
Майор Райлі

1
Це відповідь для мене. Додавання & # 038; у розташуванні мого заголовка відповіді виправлено це і не відображається Ampersand у заголовку відповідей. : D
iamjoshua

Переповнення стека настільки велике. Ось майже 11-річний пост, який вирішує мою проблему. І його переглянули понад 690 000 разів.
Білл

69

Використовуйте CDATAтеги:

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

4
Це швидше здогадка, ніж відповідь.
Брайан Оуклі

10
Це може бути здогад; це правильно, хоча. CDATA-маркери дозволяють використовувати неочищені амперсанди.
Квентін,

19
У початковій публікації ніколи не було зрозуміло, де & & nbsp; теги CDATA не можна використовувати для значень атрибутів, лише для фактичного вмісту тегів, отже, чому я включив "?".
scragar

1
Це також чудово підходить для характеристики даних у форматі XML, і ця відповідь корисна у багатьох інших сценаріях щодо надання xml-рендерінгу. Для мене це дійсно допомогло в Camel XML DSL, коли мені потрібно було встановити тіло або якийсь заголовок з деякими XML-даними, аналізатор Camel XML ігнорував вміст CDATA, читаючи їх як потік символів. Без цього верблюдовий двигун викидає недійсні винятки з структури XML
Кімутай

1
Саме ця відповідь мені була потрібна, оскільки в моєму випадку я не впевнений, які символи можуть бути в XML, тому мені потрібно уникнути всього, що знаходиться в цьому розділі.
Метт


11

У моєму випадку мені довелося це змінити %26.

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


8
Так. Зауважте, що ОП збиралася втекти в XML. Уникнення URL-адреси - інша проблема. Справжня забава починається, коли у вас є URL-адреси в XML або XML-фрагменти в URL-адресах ...
Oskar Berggren

6

Я спробував & amp, але це не вийшло. На підставі відповіді Віма десять Брінка я спробував & 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? Для мене працює у моїх XML-файлах Android. Якщо виникають проблеми, хтось дасть мені знати.


1
\uEscape не має особливого значення в XML взагалі. -1.
Марк Амерді

@MarkAmery Так, вони не мають особливих значень, саме тому вони так добре працюють - інтерпретувати нема чого, тому нічого не виходить. Ява інтерпретує 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.