为什么 XMLStarlet 将字符串中的 '>' 替换为 '>'?
Why XMLStarlet replaces '>' to '>' in a string?
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"
值,
而且 returns 意料之外的(对我来说)字符串值 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 中是否存在错误,或者它是使用 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)"/>
[=39 的应用程序 (Freeswitch v1.7) 中的错误=]as
v=-7;%(100,0,941.0,1477.0);v=-7;>=2;+=.1;%(1400,0,350,440)
XMLStarlet 这样做没有错。
>
被引号 "protected" 引用的观点是错误的。从技术上讲,>
在属性值中是 合法的 ,而不是 <
,后者是非法的(>
在文本节点值中也是如此)。
通常工具会转义 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) 对称性通常更容易处理,程序员往往喜欢它。
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"
值,
而且 returns 意料之外的(对我来说)字符串值 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 中是否存在错误,或者它是使用 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)"/>
[=39 的应用程序 (Freeswitch v1.7) 中的错误=]asv=-7;%(100,0,941.0,1477.0);v=-7;>=2;+=.1;%(1400,0,350,440)
XMLStarlet 这样做没有错。
>
被引号 "protected" 引用的观点是错误的。从技术上讲,>
在属性值中是 合法的 ,而不是 <
,后者是非法的(>
在文本节点值中也是如此)。
通常工具会转义 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) 对称性通常更容易处理,程序员往往喜欢它。