JAXB/Spring Batch 以外のソリューションを受け入れる場合は、SAX パーサーを確認することをお勧めします。
これは、XML ファイルを解析するよりイベント指向の方法であり、解析中にターゲット ファイルに直接書き込みたい場合に適した方法です。SAX パーサーは、xml コンテンツ全体をメモリに読み込むのではなく、入力ストリーム内の要素に遭遇したときにメソッドをトリガーします。私が経験した限り、これは非常にメモリ効率の高い処理方法です。
Stax-Solution と比較して、SAX はデータをアプリケーションに「プッシュ」します。これは、状態を維持する必要があることを意味します (現在のタグのように)。そのため、現在の場所を追跡する必要があります。それが本当に必要なものかどうかはわかりません
次の例では、構造内の xml ファイルを読み取り、GroupBMsg-Tags 内のすべてのテキストを出力します。
import java.io.FileReader;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class SaxExample implements ContentHandler
{
private String currentValue;
public static void main(final String[] args) throws Exception
{
final XMLReader xmlReader = XMLReaderFactory.createXMLReader();
final FileReader reader = new FileReader("datasource.xml");
final InputSource inputSource = new InputSource(reader);
xmlReader.setContentHandler(new SaxExample());
xmlReader.parse(inputSource);
}
@Override
public void characters(final char[] ch, final int start, final int length) throws SAXException
{
currentValue = new String(ch, start, length);
}
@Override
public void startElement(final String uri, final String localName, final String qName, final Attributes atts) throws SAXException
{
// react on the beginning of tag "GroupBMsg" <GroupBMSg>
if (localName.equals("GroupBMsg"))
{
currentValue="";
}
}
@Override
public void endElement(final String uri, final String localName, final String qName) throws SAXException
{
// react on the ending of tag "GroupBMsg" </GroupBMSg>
if (localName.equals("GroupBMsg"))
{
// TODO: write into file
System.out.println(currentValue);
}
}
// the rest is boilerplate code for sax
@Override
public void endDocument() throws SAXException {}
@Override
public void endPrefixMapping(final String prefix) throws SAXException {}
@Override
public void ignorableWhitespace(final char[] ch, final int start, final int length)
throws SAXException {}
@Override
public void processingInstruction(final String target, final String data)
throws SAXException {}
@Override
public void setDocumentLocator(final Locator locator) { }
@Override
public void skippedEntity(final String name) throws SAXException {}
@Override
public void startDocument() throws SAXException {}
@Override
public void startPrefixMapping(final String prefix, final String uri)
throws SAXException {}
}