2015-10-20 1 views
0

XMLStarlet редактирования:Почему XMLStarlet заменяет '>' на '>' в строке?

xmlstarlet ed -O -u "/include/X-PRE-PROCESS[@cmd='set' and starts-with(@data,'domain=')]/@data" -v 'domain=test.domain' vars.xml

на целевой файл:

<include> 
    <X-PRE-PROCESS cmd="set" data="domain=domain.com"/> 
    <X-PRE-PROCESS cmd="set" data="bong-ring=v=-7;%(100,0,941.0,1477.0);v=-7;>=2;+=.1;%(1400,0,350,440)"/> 
</include> 

изменяет необходимое data="domain=domain.com" значения,
, но и возвращает неожиданным (для меня) изменения > к &gt; в строке стоимость bong-ring=... so >=2 становится &gt;=2

<include> 
    <X-PRE-PROCESS cmd="set" data="domain=test.domain"/> 
    <X-PRE-PROCESS cmd="set" data="bong-ring=v=-7;%(100,0,941.0,1477.0);v=-7;&gt;=2;+=.1;%(1400,0,350,440)"/> 
</include> 

не ">" защищено кавычками ""?

Так что вопрос:

Есть ли ошибка в XMLStarlet или это ошибка в прикладную (Freeswitch v1.7), который использует vars.xml и разбирает
<X-PRE-PROCESS cmd="set" data="bong-ring=v=-7;%(100,0,941.0,1477.0);v=-7;&gt;=2;+=.1;%(1400,0,350,440)"/>
в
v=-7;%(100,0,941.0,1477.0);v=-7;&gt;=2;+=.1;%(1400,0,350,440)

ответ

2

Там ничего плохого в том, что XMLStarlet делает это.

Понятие о том, что > «защищено» кавычками, неверно. Технически > является законным в значениях атрибутов, в отличие от <, что является незаконным (так и > в значениях текстового узла).

Обычно инструменты избежать XML-заповедного символы независимо от контекста (*), поэтому текстовые узлы будут содержать &gt; и атрибуты будут содержать &gt;, а также. В этом нет ничего плохого.

Однако по существу каждый символ в значении атрибута или текстовом узле может быть экранирован.

Следующая является полностью законным XML, который является 100% эквивалентно оба ваших образцов:

<include> 
    <X-PRE-PROCESS cmd="&#x73;&#x65;&#x74;" data="&#x64;&#x6f;&#x6d;&#x61;&#x69;&#x6e;&#x3d;&#x74;&#x65;&#x73;&#x74;&#x2e;&#x64;&#x6f;&#x6d;&#x61;&#x69;&#x6e;"/> 
    <X-PRE-PROCESS cmd="&#x73;&#x65;&#x74;" data="&#x62;&#x6f;&#x6e;&#x67;&#x2d;&#x72;&#x69;&#x6e;&#x67;&#x3d;&#x76;&#x3d;&#x2d;&#x37;&#x3b;&#x25;&#x28;&#x31;&#x30;&#x30;&#x2c;&#x30;&#x2c;&#x39;&#x34;&#x31;&#x2e;&#x30;&#x2c;&#x31;&#x34;&#x37;&#x37;&#x2e;&#x30;&#x29;&#x3b;&#x76;&#x3d;&#x2d;&#x37;&#x3b;&#x3e;&#x3d;&#x32;&#x3b;&#x2b;&#x3d;&#x2e;&#x31;&#x3b;&#x25;&#x28;&#x31;&#x34;&#x30;&#x30;&#x2c;&#x30;&#x2c;&#x33;&#x35;&#x30;&#x2c;&#x34;&#x34;&#x30;&#x29;"/> 
</include> 

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


(*) С точки зрения XML-сериализатор: а) генерированием другого вывода для значений атрибутов и текстовых узлов делает процесс более сложной сериализации без добавления какого-либо значения результата. b) Легче написать одну функцию для XML-экранирования любой строки, а затем повторно использовать ее. c) Симметрию проще в обращении в целом, и программисты, как правило, любят ее.

+0

@kjhughes Re: [ваше править] (http://stackoverflow.com/posts/33236700/revisions#rev-arrow-ccf030a2-0b60-45ba-a1c5-de97f10a9a48): Строго говоря, нет такой вещи, как несогласованный синтаксический анализатор, так же, как нет такой вещи, как «почти XML». Это XML, или нет. И это парсер XML - или нет. :) – Tomalak

+0

Нет таких вещей: «почти XML». Согласовано.Однако «несоответствующие * парсеры *» могут существовать (и делать это во время разработки и, к сожалению, за его пределами). Теперь о тех ангелах, танцующих на голове булавки ... :) – kjhughes

+0

Почти-парсер может разбирать почти-XML. Это все в порядке, но тогда мы говорим не о XML, а о синтаксисе XML. Да, я знаю это. По этой причине я оставил редактирование. :) – Tomalak