2012-01-10 75 views
3

我正在使用REXML Ruby解析器來解析XML文件。但與64位紅寶石64位AIX中,我收到以下錯誤:Ruby中的XML解析

REXML::ParseException: #<REXML::ParseException: #<RegexpError: Stack overflow in 
regexp matcher: 
/^<((?>(?:[\w:][\-\w\d.]*:)?[\w:][\-\w\d.]*))\s*((?>\s+(?:[\w:][\-\w\d.]*:)?[\w:][\-\w\d.]*\s*=\s*(["']).*?\3)*)\s*(\/)?>/mu> 

的呼籲同樣是這樣的:

REXML::Document.new(File.open(actual_file_name, "r")) 

有沒有人有任何關於如何的想法解決這個問題?

+1

難道你是一個正則表達式的動物嗎?還是來自REXML? – 2012-01-10 03:28:18

+0

它來自REXML。這不是我寫的正則表達式。我只是使用REXML來解析XML文檔 – Ricketyship 2012-01-10 04:34:39

+1

因此,REXML給出了「正則表達式的野獸」:D – Ricketyship 2012-01-10 04:36:12

回答

6

我幾乎立即找到答案。

我做的第一件事是在ruby源代碼中搜索引發的錯誤。 我發現regex.h對此負責。

在regex.h,碼流是這樣的:

/* Maximum number of duplicates an interval can allow. */ 
#ifndef RE_DUP_MAX 
#define RE_DUP_MAX ((1 << 15) - 1) 
#endif 

現在這裏的問題是RE_DUP_MAX。在AIX框中,相同的常量已在/ usr/include中的某處定義。 我搜索了它,並在

/usr/include/NLregexp.h 
/usr/include/sys/limits.h 
/usr/include/unistd.h 

發現我不知道這三個正在使用(最有可能NLregexp.h)。 在這些標題中,RE_DUP_MAX的值已被設置爲255!所以在正則表達式的重複次數上有一個帽子!

總之,原因在於編譯採用系統定義的值,而不是我們在regex.h中定義的值!

這也回答我的問題,我最近問: Regex limit in ruby 64 bit aix compilation

我沒能立刻回答的人,因爲我需要有100個信譽分:d:d 乾杯!

12

我對REXML有幾個問題,它似乎並不是最成熟的庫。通常我使用Nokogiri來進行Ruby XML解析,它應該比REXML更快更穩定。與sudo gem install nokogiri安裝它之後,你可以使用像這樣得到一個DOM實例:

doc = Nokogiri.XML(File.open(actual_file_name, 'rb')) 
# => #<Nokogiri::XML::Document:0xf1de34 name="document" [...] > 

官方網頁的文檔也比REXML,恕我直言要好得多。

+1

我想知道這是否是與64位的紅寶石的具體問題。同樣的問題在32位盒子上不可重現。如果有相同的工作而不是安裝其他庫。 – Ricketyship 2012-01-10 04:36:43

+0

@Bharath:那麼報告這個問題的好地方就是Ruby bugtracker。 – 2012-01-10 04:42:49

+0

謝謝..會在那裏報告它... – Ricketyship 2012-01-10 04:45:11