2015-10-20 33 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=...所以>=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

有一个bug 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串行化器的点:a)生成属性值和文本节点不同的输出使串行化过程更复杂,不添加任何值的结果。 b)为XML编写单个函数更容易 - 转义任何字符串然后重新使用它。 c)一般来说对称性更容易处理,而程序员往往喜欢它。

+0

@kjhughes回复:[你的编辑](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

相关问题