2012-01-10 18 views
3

私はREXML Rubyパーサーを使用してXMLファイルを解析しています。誰がどのようにについてのアイデアを持っていますRubyでのXML解析

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

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> 

同じのための呼び出しは、このようなものです。しかし、64ビットのルビーと64ビットAIXボックスに、私は次のエラーを取得していますこの問題を解決するには?

+1

これは正規表現の獣ですか、REXMLの獣ですか? –

+0

REXMLからのものです。私が書いた正規表現ではありません。私はちょうどXML文書を解析するためにREXMLを使用しています – Ricketyship

+1

REXMLは "正規表現のビースト"を与えています:D – Ricketyship

答えて

6

私はすぐに答えを見つけました。

私が最初にしたことは、投げられているエラーのルビーソースコードを検索することでした。 私は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のどこかで定義されています。 私はそれを検索し、私は(おそらくNLregexp.h)が使用されている3のどのわからない

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

で見つかりました。 これらのヘッダーでは、RE_DUP_MAXの値が255に設定されています。だから正規表現の繰り返し数に置かれた上限がある!

つまり、regex.hで定義した値よりもシステム定義の値をとっているのです。 D:D 乾杯私は100評判の分を持っている必要があるとして、すぐにそれに答えることができませんでした Regex limit in ruby 64 bit aix compilation

また、これは私が最近求めていた私の質問に答えます!

12

REXMLにはいくつかの問題がありましたが、最も成熟したライブラリではありません。通常はRuby XMLの解析にはNokogiriを使用しますが、REXMLよりも高速で安定している必要があります。 sudo gem install nokogiriでそれをインストールした後、DOMインスタンスを取得するには、このようなものを使用することができます。

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

公式Webページ上のドキュメントもREXML、私見のそれよりもはるかに優れています。

+1

これはRuby 64ビットの特定の問題かどうか知りたいです。 32ビットボックスでも同じ問題は再現できません。そして、他のライブラリをインストールするのではなく、同じもののための回避策がある場合。 – Ricketyship

+0

@Bharath:これを報告するより良い場所は、Rubyのbugtrackerでしょう。 –

+0

ありがとうございます。そこに報告します... – Ricketyship