Синтаксический анализ XML в Ruby - PullRequest
3 голосов
/ 10 января 2012

Я использую синтаксический анализатор REXML Ruby для анализа XML-файла. Но на 64-битном AIX-боксе с 64-битным Ruby я получаю следующую ошибку:

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

У кого-нибудь есть идеи относительно того, как решить эту проблему?

Ответы [ 2 ]

12 голосов
/ 10 января 2012

У меня было несколько проблем с 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, IMHO.

6 голосов
/ 19 января 2012

Я почти сразу нашел ответ.

Первым делом я искал в исходном коде 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!

Это также отвечает на мой вопрос, который я недавно задавал: Ограничение регулярных выражений в 64-битной компиляции ruby ​​

Я не смог ответить сразу, так как мне нужно иметь минимум 100 репутации: D: D Ура!

...