2012-03-30 3 views
0

私はそうのような複数の連結XMLファイルを含む単一のファイルがあります:ファイルをアップスライスとは対照的に、Nokogiriを使用して複数のXML文書が含まれた単一のファイルを解析するにはどうすればよいですか?

<?xml version ... ?> 
<!DOCTYPE ... > 
... 
<?xml version ... ?> 
<!DOCTYPE ... > 
... 
<?xml version ... ?> 
<!DOCTYPE ... > 
... 

があるとしてファイルを解析する方法は、鋸山を使用して、ありますか?

答えて

3

個々のドキュメントにスライスする必要がありますが、それは簡単なことです。

ルビーのString.splitメソッドで簡単にできます。変数fooにテキストが含まれている場合たとえば、その後、foo.split("<?xml version ... ?>\n")は配列を返します、あなたはをループすることができます:

foo.split("<?xml version ... ?>\n") 
[ 
    [0] "", 
    [1] "<!DOCTYPE ... >\n...\n", 
    [2] "<!DOCTYPE ... >\n...\n", 
    [3] "<!DOCTYPE ... >\n..." 
] 

は、これらのチャンクのそれぞれを解析し、あなたはあなたの方法になります。あなたはNokogiriを幸せにするためにXML DECL文を前置する必要があるかもしれませんが、それがなければOKになると思います。

+0

これは、私がやっていることです、私はそれの周りにクリーンな方法はなかったと恐れていた。残念なことに、ファイル自体はかなり大きく(> 100MB)、私は生成元を制御できません。 – aosik

+0

ファイルが大きすぎて、一時的な負荷のためにほとんどのマシンにはない100MBのメモリがある場合は、ファイル内を歩き回り、コンポーネントファイルに分割して個別に処理するものを書くことができます。 –

0

これは有効なXMLファイルではないため、一度にすべて解析することはできません。しかし、Fileから継承するクラスを作成することができ、それぞれのXML文書の終わりに達すると、ファイルの終わりを返すことができます。これで、ファイルを一度開くことができるはずですが、依然としてXMLパーサーを複数回呼び出すことになります。

XMLフラグメントがそれほど大きくない場合は、フラグメントを(おそらくregexpを使用して)文字列変数にスラップして解析するのが最善の方法です。

関連する問題