私は巨大なXMLを持っています。そのファイルを解析し、すべて<elem/>
を単一の文字列として取得してデータベースに保存する必要がありますが、ファイルが巨大になる可能性があるため(〜500MB)、メモリフットプリントの低いメソッドを使用します。どうやってするか ?私はそれを行う使用可能な例を探しています。以下の例と私のあまり良くない解決策:
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<header>...<header>
<elem>
<a/><b/><c>...</c>
</elem>
<elem>
<a>...</a><b/><c>...</c>
</elem>
<elem>
<a>...</a>
</elem>
...
</doc>
分割後:
{'<elem/>', '<elem/>', ...}
今、私は以下のようにSAX DefaultHandlerを使用していますが、良い解決策ではないと思います:
class DataFileParser extends DefaultHandler {
StringBuffer sb;
boolean sElem = false; // is elem
...
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(sElem) {
sb.append("<"+qName+">");
}
if (qName.equalsIgnoreCase("elem")) {
sb = new StringBuffer();
sb.append("<"+qName+">");
sElem = true;
}
...
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("elem")) {
sElem = false;
sb.append("</"+qName+">");
}
...
}
public void characters(char ch[], int start, int length) throws SAXException {
if(sElem) {
sb.append(new String(ch, start, length));
}
}
...
}