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"
值,
但也返回意想不到的(对我来说)改变>
到>
在字符串值bong-ring=...
,所以>=2
成为>=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;>=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;>=2;+=.1;%(1400,0,350,440)"/>
解析为
v=-7;%(100,0,941.0,1477.0);v=-7;>=2;+=.1;%(1400,0,350,440)
XMLStarlet这样做没有错。
>
被引号"保护"的概念是错误的。从技术上讲,>
在属性值中是合法的,而<
在文本节点值中是非法的(>
也是如此)。
通常,无论上下文(*),工具都会转义xml保留字符,因此文本节点将包含>
,属性也将包含>
。这没什么问题。
以下是完全合法的XML, 100%等同于您的两个示例:
<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;>=2;+=.1;%(1400,0,350,440)"/>
</include>
可以归结为:XML不是字符串。不要把它当成一个。不要使用或创建将XML视为字符串的工具。XML需要一个解析器——在这种情况下,所有符合标准的解析器都会做正确的事情。
(*)从XML序列化器的角度来看:a)为属性值和文本节点生成不同的输出使序列化过程更加复杂,而无需向结果添加任何值。b)编写一个函数对任何字符串进行xml转义,然后重用它会更容易。c)对称通常更容易处理,程序员倾向于喜欢它。