2011-08-16 7 views
3

不正な形式のXMLコードを整理する問題が発生しました。SEC's edgar databaseから戻ってきました。ルビーの不正なXMLを整理する方法

何らかの理由でxmlがひどく形成されています。任意の種類の文字列を含むタグは閉じず、実際に他のタグ内に他のXMLまたはHTMLドキュメントを含むことができます。通常、私はTidyにこれを持っていたが、それは維持されていない。

Nokogiri :: XML :: SAX :: Parserを使用しようとしましたが、タグが閉じられていないためにチョークしているようです。それは、最初の終了タグに当たってからそれ以上発射されなくなるまでうまくいくように思えます。しかし、それは正しい文字を吐くことです。

これは他のxmlまたはhtmlドキュメントを無視することができるので、これが最適なオプションのようです。また、これらの文書のいくつかが非常に大きくなってメモリ全体にdomを格納するのがおそらくうまくいかない可能性があるので、これが最も理にかなっています。ここで

は、いくつかのサンプルファイルは、次のとおりです。123

私はちょうど

+0

大きなファイルを意味する場合は「かなり大きい」と定義してください。最近のほとんどのマシンは、マルチギガバイトのファイルを簡単に呑み込むことができます。 –

答えて

3

鋸山の通常のDOMモードが自動的に修正アップすることができます私自身のカスタムパーサーを作成する必要があります考え始めていますXMLのように構文的に正しいか、またはそれの妥当なファクシミリです。時には混乱して終了タグを前後に移動させますが、必要に応じてファイルを前処理して正しい方向に微調整することができます。

は私が文書に出XML#1を保存し、それをロード:

require 'nokogiri' 

doc = '' 
File.open('./test.xml') do |fi| 
    doc = Nokogiri::XML(fi) 
end 

puts doc.to_xml 

解析した後、あなたがのために、生成されたどのようなエラーが参照するには鋸山:: XML :: Documentインスタンスのerrors方法を確認することができます間違った喜び。

doc.errors 

鋸山のDOMモデルを使用することは十分ではない場合、あなたはSAXが動作するように、きれいなXMLを放出、前処理にXMLLintを使用して検討し、データをきれいにしていますか?その--recoverオプションが役に立つかもしれません。

xmllint --recover test.xml 

それは出力stderrにエラー、および標準出力にコードをますので、あなたは別のファイルに簡単にパイプそれをすることができます。

あなた自身のパーサーを書くのはなぜですか?あなたは他にも選択肢がありますし、うまく実装されたホイールを改革するのは時間を有効に活用するものではありません。

+0

これらのソリューションのいずれも実際にサンプルファイルでは動作しません。彼らは終了タグの大部分を最後に置く。 – hadees

+2

正確に何かを正しく行うためにパーサに十分な情報を与えるためにファイルを前処理しなければならないと言ったのはどちらかといえます。 –

+0

@hadeesこれらのソリューションはどちらも、標準によって明示的に禁止されている整形式でないXMLを回復しようとしてから動作しません。ツールは、タグをどこで閉じるかを知る方法がありません。 – Serabe

関連する問題