2012-01-13 6 views
1

私のJavaアプリケーションはXMLファイルをロードしてからXMLを解析します。オンザフライでファイルを検索/置換する方法は?

SAXBuilderを作成する前に、ファイルの検索/置換を行います。どのように私はメモリにこれを行うことができます(ファイルに書き込む必要はありません)?

は、ここに私のコードだ、と私は検索を行うENVISION場所/置き換え:

private String xmlFile = "D:\\mycomputer\\extract.xml"; 
File myXMLFile = new File(xmlFile); 

// TODO 
// REPLACE ALL "<content>" in xmlFile with "<content><![CDATA[" 
// REPLACE ALL "</content>" with "]]></content>" 

SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser"); 

document = builder.build(new File(myXMLFile)); 
+0

どのようにあなたがそれらを記述することなく、ファイル内の項目を置き換えるのでしょうか? –

答えて

1

あなたは質問を自分に答えた - それに代わる実行してSAXParserのを呼び出して、StringBuilderのにファイル全体を読み込みます。

文字列がにStringReaderを使用してSAXBuilderに渡すことができます。

 
StringBuilder sb = new StringBuilder(); 
loadFIleContent (filePath, sb); 
document = builder.build (new StringReader (sb.toString())); 

PS:ファイルが本当に大きい場合、完全にメモリにそれを読むためには非現実的だ(〜100Mbの)

:theglauberの答えにフォローアップそれをDOMツリーに解析します。この場合は、SAXParserを使用し、解析対象のファイルとして置き換えることを検討する必要があります。

+0

私のXMLファイルは約10MBですが、それほど悪くないと思います。 –

+0

次に、解析後にメモリに作成されたDOMツリーを保持するために~100Mbがさらに必要になるように準備してください。 –

1

ファイルをメモリに読み込み、検索/置換して、SAXBuilder(StringReader)メソッドを使用します。

0

これらのファイルの大きさに応じて、ファイルを文字列に読み込んだり、メモリ内の置き換えを行ったり、文字列からXMLを構築したり、新しいスレッドを生成してファイルを読み込んだり、そのスレッドの出力からXMLを構築します。

(私は構文解析とXMLツリーを変更またはXMLフィルタを使用することをお勧めしますが、私はあなたのファイルの現在の内容が正しいXMLではありませんので、あなたがこの文字列ベースの交換をしたいと思う。)

1

ます最初apache commons ioでの文字列にファイルを読み込み、その後、次のコードスニペットにようSaxBuilderの入力ソースを変更することができます。

String fileStr = FileUtils.readFileToString(myXMLFile); 
fileStr = fileStr.replaceAll("<content>","<content><![CDATA["); 
fileStr = fileStr.replaceAll("</content>","]]></content>"); 
SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser"); 
document = builder.build(new ByteArrayInputStream(fileStr.getBytes())); 
+0

ByteArrayInputStreamではなくStringReaderを使用して、ファイルが非常に大きい場合にメモリオーバーヘッドを発生させるString.getBytesの使用を避ける方がよいでしょう。 –

+0

その場合はあなたが正しい – suat

関連する問題