2012-02-07 11 views
0

プレーンテキストを含むサーバーからかなり大きなログファイルがあります。サーバーはすべてのことをログに記録し、時には解析に興味のあるxmlタグを出力します。あなたの例を与えるために:JavaとSAXを使用して、時折XMLタグでプレーンテキストファイルを解析する方法は?

-----------log file------------- 
bla bla bla random text 
<logMessage>test Message</logMessage> 
some more random server output 
<logMessage>some other message</logMessage> 
bla bla bla 
end of log file 

私はちょうど< LogMessageに>タグからデータを抽出し、残りを無視したいです。私はJavaとSAXを使用していますが、SAXパーサーはファイルの内容が厳密にXML形式であると予想しており、このタイプのファイルは処理できません。 SAXに、ファイルが整形式のXMLではないという事実を無視/無視するように指示する方法はありますか? 代替手段はありますか?ファイルを1行ずつ読み込み、タグを探しますか? :(

+0

あなたが唯一の特定の​​blablablahが必要な場合は、小さな猫をボトルに詰め取得することができますし、 – Alfabravo

答えて

1

私はFを読んを選ぶだろう簡単にするため行ごとに<logMessage></logMessage>のトークンを探します。デリゲートパーサーをとりSAXのようなイベントを送る汎用のパーサを作ることができます。 (パーサーを書き直す作業に応じて役に立つかもしれませんが、SAXベースのソリューションは機能しません)

EDIT:デリゲートアプローチは、複数の種類に興味がある場合にも便利です要素の。これらが複雑な(埋め込まれた)XML階層を持つ場合は、開閉トークンの間にあるすべての文字をバッファーに照合してから、 SAXパーサーにそのバッファーを供給することもできます。これは大抵の場合過度なものになりますが、XMLダンプを基本的に含むログがあれば、それを自分ですべて解析するよりも適切かもしれません。

+0

すべてのブロックに開始タグと終了タグがあります。間には、私が読んでみたい他のタグがあります。私はすでにSAXパーサーを書いているので、私は、行ごとにログを読み込み、別のストリームで私が興味を持っているブロックをコピーしてから、そのストリームをサックスパーサーに送ります。ご協力いただきありがとうございます。 –

0

この種のファイルの解析には、まっすぐなXML解析は適切ではないと思われます。すべてのXMLスニペットが行に含まれている場合(開始タグと終了タグが同じ行にある場合)非XML行をスキップした後は、処理のためにストリームをSAXパーサーに渡すか、regexpを行単位で渡すことができます。

基本的に上記のアプローチはその後、唯一のXMLタグを残す整形XMLを作成し、それを解析するために、ルート要素でそれをラップする最初のファイルをgrepをと同じです。

+0

XMLタグを(あなたは文書全体が、特定のパターンを解析していないとして)複数の行に長くなることが正規表現を使用します異なる種類のものです。彼らはブロックで来て、1ブロックはサーバ出力の1.000〜10.000行に一度来る。しかし、サーバーはそれ自身の2〜10行ごとにいくつかのタグを出力するので、たくさんのタグがそこにスクランブルされています。私が興味を持っているブロックには特定のタグがあります。 –

+0

あなたのコメントから詳細を読む。トップレベルのタグが常に同じ場合、興味のあるタグを開く前に内容を無視して入力をスキャンし、タグを閉じるまでパーサーに渡してください。不要なコンテンツを削除するためのフィルタリングされた入力ストリームの種類 – maximdim

関連する問題