Как включить &, ‹, › и т. д. в значения атрибутов XML

Я хочу создать файл XML, который будет использоваться для хранения структуры программы Java. Я могу успешно разобрать программу Java и создать необходимые теги. Проблема возникает, когда я пытаюсь включить исходный код в свои теги, поскольку исходный код Java может использовать огромное количество ссылок на сущности и зарезервированных символов, таких как &, <, >, &. Я не могу создать допустимый XML.

Мой XML должен выглядеть так:

<?xml version="1.0"?>
<prg name="prg_name">
  <class name= "class_name>
    <parent>parent class</parent>
      <interface>Interface name</interface>
.
.
.
      <method name= "method_name">
        <statement>the ordinary java statement</statement>
        <if condition="Conditional Expression">
          <statement> true statements </statement>
        </if>
        <else>
          <statement> false statements </statement>
        </else>
        <statement> usual control statements </statement>
 .
 .
 .
      </method>
    </class>
 .
 .
 .
 </prg>

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

Я могу использовать CDATA для экранирования текста элемента, но его нельзя использовать для значений атрибутов, содержащих условные выражения. Я использую Antlr грамматику Java для анализа программы Java и получения атрибутов и содержимого для тегов. Так есть ли другой обходной путь для этого?


person Sudh    schedule 18.04.2011    source источник


Ответы (2)


Вам придется бежать

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

для xml.

person Bala R    schedule 18.04.2011
comment
Как насчет + (плюс) - person TheLD; 15.03.2017
comment
@LarsVandeDonk + можно оставить как есть, не нужно экранировать его в XML. Может быть, вы говорили об экранировании URL? - person izogfif; 03.07.2017

В атрибутах XML вы должны избежать

" with &quot;
< with &lt;
& with &amp;

если вы заключаете значения атрибутов в двойные кавычки ("), например.

<MyTag attr="If a&lt;b &amp; b&lt;c then a&lt;c, it's obvious"/>

означает тег MyTag с атрибутом attr с текстом If a<b & b<c then a<c, it's obvious - примечание: нет необходимости использовать &apos; для экранирования символа '.

Если вы заключаете значения атрибутов в одинарные кавычки ('), вам следует экранировать эти символы:

' with &apos;
< with &lt;
& with &amp;

и вы можете написать " как есть. Экранирование > с помощью &gt; в тексте атрибута не требуется, например <a b=">"/> — это правильно сформированный XML.

person izogfif    schedule 15.09.2015
comment
Почему XML требует экранирования специальных символов внутри кавычек в случае значений атрибутов? Только или ' нужно было бы заключать в кавычки... и все остальное внутри этой строки можно было бы просто считать содержимым! - person Teddy; 16.04.2016
comment
Я предполагаю, что это предостережение от плохо написанных парсеров XML и/или неправильного XML. Например, если кавычки для атрибутов опущены (<tag attr=value></tag>). - person izogfif; 20.09.2016
comment
Не эксперт, но я подозреваю, что это историческая мера предосторожности из-за SGML, который изначально использовался для определения HTML и других языков разметки типов. - person LMA1980; 24.11.2016
comment
Даже с современными парсерами закрывающий тег является проблемой. Начальный тег не дает никаких ошибок. - person Sorter; 21.12.2016
comment
Это более правильно, чем принятый ответ, потому что он обеспечивает минимальный набор необходимых побегов. - person TToni; 27.04.2018