SAX仕様でXMLを読み込むサンプルです。
DOMはとにかくメモリを食いますので、その点ではSAXを使ったほうがよさそうですが、SAXはプログラムが分かりにくくなるという欠点もあります。
//パーサー呼び出しサンプル
File file = new File(XMLファイル名); SAXParserFactory spfactory = SAXParserFactory.newInstance(); // SAXパーサーを生成 SAXParser parser = spfactory.newSAXParser(); // XMLファイルを指定されたデフォルトハンドラーで処理します XMLParse xmlParse = new XMLParse(); parser.parse(file, xmlParse);
//以下、XMLパーササンプル
/** * XMLのパーサ * MyObjectは適当に作成してください。 * startElementで文字列が取れるので、カレントのオブジェクトに * 設定していきます。ただ、文字列は途中で切れている可能性が * あるので、 startElement内では文字列をアペンドしておき、 * endElementなどで実際の値に変換すると良いです。 */ public class XMLParse extends DefaultHandler { /** * オブジェクトのスタック */ protected Stack stack; /** * 現在のオブジェクト */ protected Object currentObj; /** * 現在のタグ */ protected String currentTag; /** * コンストラクタ */ public XMLParse() { stack = new Stack(); }
/** * ファイル読み込み開始 */ public void startDocument() { System.out.println("読み込み開始"); } /** * タグの読み込み開始 */ public void startElement(String uri, String localName, String qName, Attributes attributes) { try { currentTag = qName; if (qName.equals(MY_OBJECT_TAG_NAME)) { currentObj = MyObject.getInstance(attributes); stack.push(currentObj); } } catch (Exception e) { e.printStackTrace(); } }
/** * タグ内の文字データの通知を受け取る。 */ public void characters(char[] ch, int offset, int length) { try { String value = new String(ch, offset, length); //valueは途中で文字が切れている可能性があるので、 //ここでは文字列をセットするだけにとどめる if (currentObj != null) currentObj.setValue(currentTag, currentAttr, value); } catch (Exception e) { e.printStackTrace(); } }
/** * タグの読み込み終了 */ public void endElement(String uri, String localName, String qName) { try { if (currentObj == null) return; if (qName.equals(MY_OBJECT_TAG_NAME)) { stack.pop(); if (stack.empty()) currentObj = null; else currentObj = (MyObject)stack.peek(); } } catch (Exception e) { e.printStackTrace(); } }
/** * ファイル読み込み終了。 */ public void endDocument() { System.out.println("読み込み終了"); } }
|