4

我正在使用 REXML Ruby 解析器来解析 XML 文件。但是在带有 64 位 Ruby 的 64 位 AIX 机器上,我收到以下错误:

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"))

有谁知道如何解决这个问题?

4

2 回答 2

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,恕我直言。

于 2012-01-10T03:32:08.893 回答
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 干杯!

于 2012-01-19T11:09:04.483 回答