2012-01-10 78 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