为什么XMLStarlet取代'>'到'>'在一个字符串?

时间:2015-10-20 11:59:40

标签: xml freeswitch 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)

1 个答案:

答案 0 :(得分:4)

XMLStarlet没有任何问题。

import java.util.*; public class Problem8 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int a = scan.nextInt(); int b = scan.nextInt(); int c = scan.nextInt(); boolean equalOK = true; equalOK = scan.nextBoolean(); if(c > b && c > a && b > a) { System.out.println("Strictly Increasing Order"); } else if((a == b && c > b && equalOK) || (b == c && c > a && equalOK) || (a == b && b == c && equalOK)) { System.out.println("Increasing Order"); } else { System.out.println("Not in Order"); } } } 正在受到保护的概念&#34;引用是错误的。从技术上讲,>在属性值中是 legal ,而不是>,这是非法的(在文本节点值中也是<)。

通常工具会转义XML保留字符而不管上下文(*),因此文本节点将包含>,属性也将包含&gt;。这没有什么不妥。

但是,实质上属性值或文本节点值中的每个字符都可以被转义。

以下是完全合法的XML,它与您的两个样本完全等效:

&gt;

归结为:XML不是字符串。不要把它当成一个人。不要使用或创建将XML视为字符串的工具。 XML需要一个解析器 - 在这种情况下,所有符合标准的解析器都会做正确的事情。

(*)从XML序列化程序的角度来看:a)为属性值和文本节点生成不同的输出会使序列化过程更加复杂,而不会向结果添加任何值。 b)编写单个函数以便XML转义任何字符串然后重新使用它会更容易。 c)一般来说,对称性更容易处理,程序员也喜欢它。