Які символи мені потрібні для отримання у XML-документах?


925

Які символи повинні бути залишені в документах XML або де я можу знайти такий список?


7
Приклад:<company>AT&amp;T</company>
jacktrades

Див. Спрощений XML Escaping нижче для стислого та легко запам’ятовуваного посібника, який я перегнав із первинних джерел ( W3C Extensible Markup Language (XML) 1.0 (Fifth Edition) ).
kjhughes

Відповіді:


1356

Якщо ви використовуєте відповідний клас або бібліотеку, вони зроблять вам втечу. Багато проблем з XML викликаються конкатенацією рядків.

XML символи втечі

Усього п'ять:

"   &quot;
'   &apos;
<   &lt;
>   &gt;
&   &amp;

Утеча символів залежить від того, де використовується спеціальний символ.

Приклади можна перевірити в службі перевірки розмітки W3C .

Текст

Безпечний спосіб - уникнути всіх п'яти символів у тексті. Тим НЕ менше, три символу ", 'і >треба не бути екрановані в тексті:

<?xml version="1.0"?>
<valid>"'></valid>

Атрибути

Безпечний спосіб - уникнути всіх п'яти символів в атрибутах. Однак >символів не потрібно уникати в атрибутах:

<?xml version="1.0"?>
<valid attribute=">"/>

'Символ не повинен бути екрановані в атрибутах , якщо котирування є ":

<?xml version="1.0"?>
<valid attribute="'"/>

Так само "не потрібно уникати атрибутів, якщо цитати ':

<?xml version="1.0"?>
<valid attribute='"'/>

Коментарі

Усі п'ять спеціальних персонажів не можна уникати в коментарях:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

Не можна уникати всіх п'яти спеціальних символів у розділах CDATA :

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

Інструкції з обробки

У всіх інструкціях з обробки XML не можна уникати всіх п'яти спеціальних символів :

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML проти HTML

HTML має власний набір кодів втечі, які охоплюють набагато більше символів.


33
@Pacerier, прошу вас не писати свій власний код уникнення XML / HTML. Використовуйте функцію бібліотеки, або ви зобов'язані пропустити спеціальний випадок.
Джейсон

5
Також для розривів рядків потрібно використовувати & # xA; & # xD; та & # x9; для вкладки, якщо вам потрібні ці символи в атрибуті.
radistao

78
Якщо ви збираєтеся робити пошук / заміну на них, просто не забудьте зробити & amp; заміна перед іншими.
Дуг

2
@Doug Я збирався згадати саме те саме - інакше всі інші замінені персонажі будуть зіпсовані, а такі речі, як на &quot;зміну, будуть змінені на&amp;quot;
Джеррі Додж

5
З Вікіпедії: "Усі дозволені символи Unicode можуть бути представлені числовим посиланням символів." Тож їх набагато більше 5.
Тім Купер

93

Можливо, це допоможе:

Список посилань на сутність символів XML та HTML :

У документах SGML, HTML та XML логічні конструкти, відомі як символьні дані та значення атрибутів, складаються з послідовностей символів, у яких кожен символ може проявлятися безпосередньо (представляючи себе), або може бути представлений рядом символів, що називається посиланням на символи, яких існує два типи: числова посилання символів та посилання на сутність символу. У цій статті перераховані посилання суб'єктів символів, які дійсні в документах HTML та XML.

У цій статті перелічено наступні п'ять попередньо визначених об'єктів XML:

quot  "
amp   &
apos  '
lt    <
gt    >

73

Відповідно до специфікацій Всесвітнього веб-консорціуму (w3C), існує 5 символів, які не повинні відображатися в їх буквальній формі в XML-документі , за винятком випадків, коли вони використовуються як обмежувачі розмітки або в межах коментаря, інструкції з обробки або розділу CDATA . У всіх інших випадках ці символи повинні бути замінені або за допомогою відповідної сутності, або числової посилання відповідно до наступної таблиці:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

Зауважте, що згадані об'єкти можуть використовуватися також у HTML, за винятком & apos; , що було введено з XHTML 1.0 і не задекларовано в HTML 4. З цієї причини та для забезпечення ретро-сумісності специфікація XHTML рекомендує використовувати & # 39; замість цього.


14
XML заздалегідь визначає ці п'ять сутностей, але абсолютно НЕ вказує, що ви не можете використовувати жоден із цих п'яти символів у їх буквальному вигляді. <і & потрібно уникати скрізь (крім CDATA). "та" потрібно уникати лише у значеннях атрибутів, і лише якщо відповідний символ цитати однаковий. І> ніколи насправді не потрібно
уникати

3
Як було написано вище, <> "&" не потрібно уникати, коли вони використовуються як роздільники розмітки або в коментарі, інструкції з обробки або розділі CDATA, тобто коли ви використовуєте <> як тег XML, ви не уникаєте цього . Те саме, що стосується коментаря (чи вдасться ви уникнути & в коментованому рядку файлу XML? Вам цього не потрібно, і ваш XML все ще дійсний, якщо ви цього не зробите). Це чітко зазначено в офіційних рекомендаціях щодо XML від W3C .
Альбз

7
@ShaunMcCance >слід уникати, якщо це випливає з ]]вмісту, за винятком випадків, коли він має бути частиною ]]>роздільника, що вказує на кінець розділу CDATA.
Лі Д

2
Щоб не бути некромантом, але @Albz невірно сказати, що цих символів ОБОВ'ЯЗКОВО бути дозволеними. Див. Розділ 2.4 за адресою w3.org/TR/REC-xml/#NT-CharData . Версія TL; DR полягає в тому, що у вмісті елементів chardata & amp; і & lt; завжди мають бути довіреними. & Gt; символ МОЖЕ бути дозволено, хоча це ОБОВ'ЯЗКОВО буде з'являтися в прямому рядку "]]>", оскільки в іншому випадку це буде прочитано як закінчення розділу CDATA. Для одноразових та подвійних цитат ви можете втекти, якщо захочете. Це все, для елементів chardata всередині. Інші компоненти XML мають інші правила.
skye --- капітан

52

Екрани символів відрізняються для тегів та атрибутів.

Для тегів:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

Для атрибутів:

" &quot;
' &apos;

З даних символів та розмітки :

Символ амперсанда (&) та лівий кутовий дужок (<) не повинні відображатись у прямому вигляді, за винятком випадків, коли вони використовуються як обмежувачі розмітки, або в коментарі, інструкції з обробки чи розділі CDATA. Якщо вони потрібні в іншому місці, їх слід уникнути, використовуючи або числові посилання символів, або рядки "& amp;" та "& lt;" відповідно. Правий кутовий кронштейн (>) може бути представлений за допомогою рядка "& gt;", і для сумісності його слід уникати, використовуючи або "& gt;", або посилання символів, коли воно відображається у рядку "]]>" коли цей рядок не позначає кінця розділу CDATA.

Щоб дозволити значенням атрибутів містити як одиничні, так і подвійні лапки, символ апострофа або одноцитата (') може бути представлений як "& a", а символ подвійного цитування (") як" & quot; ".


Це означає, що для атрибутів потрібно
уникати

40

Нова спрощена відповідь на старе поширене запитання ...

Спрощене скасування XML (пріоритетне, 100% заповнене)

  1. Завжди (важливо пам'ятати на 90%)

    • Втекти так, <як &lt;тільки <не починається <tag/>.
    • Втекти, &як &amp;якщо &не починається &entity;.
  2. Значення атрибутів (важливо пам'ятати 9%)

    • attr=" 'Одиночні котирування 'в порядку подвійних лапок."
    • attr=' "Подвійні котирування "в порядку однієї лапки.'
    • Втекти "як &quot;і 'як &apos;інакше.
  3. Коментарі , CDATA та інструкції з обробки (важливо пам'ятати 0,9%)

    • <!--У коментарях --> нічого не потрібно уникати, але жодних --рядків не допускається.
    • <![CDATA[У CDATA ]]> нічого не потрібно уникати, але ні]]> рядки не допускаються.
    • <?PITargetУ межах ПІ ?> нічого не потрібно уникати, але жодні ?>рядки не допускаються.
  4. Езотерика (важливо пам'ятати 0,1%)

    • Вимкніть, ]]>як ]]&gt;тільки ]]>не закінчується розділом CDATA.
      (Це правило стосується взагалі даних про символи - навіть поза розділом CDATA.)

Ще одне правило, яке варто зауважити: ]]>потрібно уникати ]]&gt;, навіть якщо він не знаходиться в розділі CDATA. Найпростішим способом досягнення цього може бути завжди втекти >як &gt;.
Майкл Кей

Дякую, @MichaelKay Я включив вашу корисну записку про, ]]> але вирішив перенести її на езотерику, а не пропонувати > завжди уникати (чого, як ви знаєте, не потрібно). Моя мета тут зробити правила виходу з XML легко запам'ятовувати і на 100% точні .
kjhughes

Наведені вище відповіді, включаючи прийняте одне згадування, всі п’ять символів повинні бути залишені всередині атрибутів. Чи є у вас посилання на стандарт XML, щоб підтвердити те, що ви говорите, оскільки логічно здається, що ваша відповідь є правильною?
Роман Сусі

1
@RomanSusi: Так, багато інших відповідей містять помилки або перегенералізацію ("Безпечний спосіб ..."), засновану на чутті, неправильному тлумаченні чи нерозумінні офіційного XML BNF. Моя відповідь (a) 100% виправдана рекомендацією W3C XML; див. безліч пов'язаних посилань на офіційний BNF та (b), організованих у стислій, логічній та легко запам'ятовується прогресуванні цих вимог.
kjhughes

@RomanSusi: Конкретне твердження про те, що "всі п’ять символів повинні бути уникнуті всередині атрибутів", є неохайним керівництвом, яке не підтримується офіційним правилом BNF, AttValueцитується у моїй відповіді за посиланням на 2. Значення атрибутів .
kjhughes

25

Окрім загальновідомих п’яти символів [<,>, &, "і '], я також уникав би символу вертикальної вкладки (0x0B). Це дійсний UTF-8, але не дійсний XML 1.0 і навіть багато бібліотек (включаючи дуже портативну (ANSI C) бібліотеку libxml2 ) пропускають її і мовчки виводять недійсний XML.


11

Скорочений: XML, Escaping

Існує п'ять заздалегідь визначених утворень:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

"Усі дозволені символи Unicode можуть бути представлені числовою посиланням символів." Наприклад:

&#20013;

Більшість контрольних символів та інших діапазонів Unicode спеціально виключаються, тобто (я думаю) вони не можуть відбуватися ні втеченими, ні прямими:

Дійсні символи в XML


3

Це залежить від контексту. Щодо змісту, це < і & , і ]]> (хоча рядок із трьох замість одного символу).

Для значень атрибутів це < , & , " і ' .

Для CDATA це ]]> .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.