【问题标题】:Why XMLStarlet replaces '>' to '>' in a string?为什么 XMLStarlet 将字符串中的 '>' 替换为 '>'?
【发布时间】:2023-04-05 07:53:01
【问题描述】:

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=... 中返回意外的(对我而言)&amp;gt;&amp;gt; 的更改,因此 &amp;gt;=2 变为 &amp;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>

"&gt;" 不是受到引号 "" 的保护吗?

所以问题是:

XMLStarlet 中是否存在错误,或者它是使用 vars.xml 并解析的应用程序 (Freeswitch v1.7) 中的错误
&lt;X-PRE-PROCESS cmd="set" data="bong-ring=v=-7;%(100,0,941.0,1477.0);v=-7;&amp;gt;=2;+=.1;%(1400,0,350,440)"/&gt;
as
v=-7;%(100,0,941.0,1477.0);v=-7;&amp;gt;=2;+=.1;%(1400,0,350,440)

【问题讨论】:

    标签: xml freeswitch xmlstarlet


    【解决方案1】:

    XMLStarlet 这样做并没有错。

    &amp;gt; 被引号“保护”的概念是错误的。从技术上讲,&amp;gt; 在属性值中是合法,而 &lt; 是非法的(在文本节点值中 &amp;gt; 也是如此)。

    通常,无论上下文如何,工具都会转义 XML 保留字符(*),因此文本节点将包含 &amp;gt;,属性也将包含 &amp;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) 对称性通常更容易处理,程序员也喜欢它。

    【讨论】:

    • @kjhughes 回复:your edit:严格来说,不存在不符合标准的解析器,就像不存在“几乎 XML”这样的东西。它是 XML,或者不是。它是一个 XML 解析器——或者不是。 :)
    • 没有这样的东西:“几乎是 XML。”同意。然而,“不符合标准的解析器”可能存在(并且在开发过程中存在,不幸的是,在开发之后)。现在,关于那些在针头上跳舞的天使...... :)
    • 几乎解析器可以解析几乎 XML。没关系,但是我们不是在谈论 XML,也不是在谈论 XML 解析器。是的,我知道这很令人毛骨悚然。出于这个原因,我留下了编辑。 :)
    • 嘿,我模仿了fancy standards language 并得到了@Tomalak 接受的编辑。我今天过得很愉快!
    • 呃,单条评论太讽刺了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多