2010-08-22 57 views
2

我有一個XML文件(實際上是一個Visual C#項目文件),我想使用Ruby腳本進行操作。我想將XML讀入內存,在它們上面做一些工作,包括更改一些屬性和一些文本(修復一些路徑引用),然後將XML文件寫回去。這並不難。用於處理具有最小差異的XML的Ruby庫?

難的是,我想我寫看起來是一樣的,因爲我讀的文件,除非我所做的更改的文件。如果輸入文件使用雙引號,我希望輸出使用雙引號。如果輸入在/>之前有一個空格,我希望輸出執行相同的操作。基本上,我希望輸出與輸入相同,除非我明確進行了更改(在我的情況下,這只是將屬性值或元素的文本內容)。

我想最少的diff,因爲該項目文件簽入版本控制 - 因爲下一次我做在Visual Studio中的變化,這將改寫在其首選格式反正。我想避免檢查一堆無意義的差異,然後在不久的將來再次改變。我也想避免必須在Visual Studio中打開項目,進行更改並保存,然後才能提交我的Ruby腳本的更改。我希望我的Ruby腳本只做更改,沒有更多。

我原本只是解析與正則表達式的文件,但碰到了,我真的很需要一個XML庫,因爲我需要更多地瞭解孩子因素的案件。所以我轉而使用REXML。但它會對我的格式造成以下不希望的更改:

  • 它將所有屬性從雙引號更改爲單引號。
  • 它會把屬性值中的所有的單引號(其更改爲')。
  • 它刪除/>之前的空間。
  • 它按字母順序排列每個元素的屬性,而不是保留原始順序。

我解決這個工作做了一堆對REXML的輸出gsub電話,但有一個Ruby XML的操作庫,這是一個更適合「最小差異」的情況?

+0

嗨喬,我打相同的磚牆你張貼了這個問題,近兩年之後。你有沒有找到解決方案?如果你還記得。 :) – focuser 2012-06-22 23:22:38

+0

@focuser,我想我只是使用正則表達式而不是XML解析器。正則表達式對於XML處理來說通常是一個糟糕的選擇,但是如果你正在做一些非常有針對性的事情,那麼它們就可以開始工作。 – 2012-06-23 00:29:16

+0

我明白了......謝謝喬。由於我使用JRuby,也許我只會使用一些Java庫。但有點蹩腳,Ruby不支持這樣的事情.. – focuser 2012-06-23 05:11:13

回答

1

您可以構建自己的SAX解析器(使用Nokogiri,例如,它非常容易,我推薦使用它)來解析XML文件,更改其中的一些數據,並使用您自己的自定義刷新已處理的XML文件,從頭開始構建XML生成器。壞消息是,在這種情況下,您必須構建一個小型的XML庫和生成器例程,因此它不是一項普通的任務。

另一種方法:不建SAX解析器,但是寫XML生成。使用您最喜歡的庫解析XML,更改需要更改的內容並生成您想要的任何內容。您只需遞歸瀏覽文檔中的所有節點,然後在慣例中輸出它們。

+0

我需要能夠向前看(在一個元素的孩子),以決定我需要重寫,所以使用流API不會本身就足夠了。我需要加載文檔,制定我想要重寫的計劃,然後再次使用流API重寫文件。它可能會工作,但它是在我所希望的痛苦的一面。 – 2010-08-22 22:01:02