2015-10-20 60 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

相關問題