我有一個XML文件(實際上是一個Visual C#項目文件),我想使用Ruby腳本進行操作。我想將XML讀入內存,在它們上面做一些工作,包括更改一些屬性和一些文本(修復一些路徑引用),然後將XML文件寫回去。這並不難。用於處理具有最小差異的XML的Ruby庫?
難的是,我想我寫看起來是一樣的,因爲我讀的文件,除非我所做的更改的文件。如果輸入文件使用雙引號,我希望輸出使用雙引號。如果輸入在/>
之前有一個空格,我希望輸出執行相同的操作。基本上,我希望輸出與輸入相同,除非我明確進行了更改(在我的情況下,這只是將屬性值或元素的文本內容)。
我想最少的diff,因爲該項目文件簽入版本控制 - 因爲下一次我做在Visual Studio中的變化,這將改寫在其首選格式反正。我想避免檢查一堆無意義的差異,然後在不久的將來再次改變。我也想避免必須在Visual Studio中打開項目,進行更改並保存,然後才能提交我的Ruby腳本的更改。我希望我的Ruby腳本只做更改,沒有更多。
我原本只是解析與正則表達式的文件,但碰到了,我真的很需要一個XML庫,因爲我需要更多地瞭解孩子因素的案件。所以我轉而使用REXML。但它會對我的格式造成以下不希望的更改:
- 它將所有屬性從雙引號更改爲單引號。
- 它會把屬性值中的所有的單引號(其更改爲
'
)。 - 它刪除
/>
之前的空間。 - 它按字母順序排列每個元素的屬性,而不是保留原始順序。
我解決這個工作做了一堆對REXML的輸出gsub
電話,但有一個Ruby XML的操作庫,這是一個更適合「最小差異」的情況?
嗨喬,我打相同的磚牆你張貼了這個問題,近兩年之後。你有沒有找到解決方案?如果你還記得。 :) – focuser 2012-06-22 23:22:38
@focuser,我想我只是使用正則表達式而不是XML解析器。正則表達式對於XML處理來說通常是一個糟糕的選擇,但是如果你正在做一些非常有針對性的事情,那麼它們就可以開始工作。 – 2012-06-23 00:29:16
我明白了......謝謝喬。由於我使用JRuby,也許我只會使用一些Java庫。但有點蹩腳,Ruby不支持這樣的事情.. – focuser 2012-06-23 05:11:13