Androidプラットフォームでのxmlファイルの解析:SAX、PULL

9765 ワード

SAXはイベント解析メカニズムを利用してメモリを消費することが少なく、携帯電話などのモバイル機器に非常に適している.SAXはイベントです
ドライバ、イベント定義はContentHandlerインタフェースで、ContentHandlerでよく使われる方法は次のとおりです.
//テキストノードの処理
•characters(char[] ch, int start, int length)
//ノード終了時にトリガー
•endElement(String uri, String localName, String qName)
//ドキュメント開始時にトリガー
•startDocument()
//ノードの解析中にトリガーされる(qName:ネームスペース接頭辞付きラベル名)
•startElement(String uri, String localName, String qName, Attributes attributes)
//ドキュメント終了時にトリガー
•endDocument()
解析ツールクラス

   
     
public class XmlTool {
public static List < User > readXmlSAX(InputStream inputStream) throws Exception{
SAXParserFactory factory
= SAXParserFactory.newInstance();
SAXParser parser
= factory.newSAXParser();
MyDefaultHandler defaultHandler
= new XmlTool().init();
parser.parse(inputStream, defaultHandler);
inputStream.close();
return defaultHandler.getUsers();
}
public MyDefaultHandler init(){
return new MyDefaultHandler();
}

public class MyDefaultHandler extends DefaultHandler{
private List < User > users;
private User user;
private String content;

public List < User > getUsers() {
return users;
}
@Override
public void characters( char [] ch, int start, int length)
throws SAXException {
super .characters(ch, start, length);
content
= new String(ch,start,length);
}
@Override
public void startDocument() throws SAXException {
users
= new ArrayList < User > ();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes)
throws SAXException {
super .startElement(uri, localName, qName, attributes);
if ( " user " .equals(localName)){
user
= new User();
user.setId(Integer.parseInt(attributes.getValue(
" id " )));
}
}

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super .endElement(uri, localName, qName);
if ( " name " .equals(localName)){
user.setName(content);
}
else if ( " password " .equals(localName)){
user.setPassword(content);
}
else if ( " user " .equals(localName)){
users.add(user);
}
}
}
}

SAXを使用してxmlファイルを解析できるほか、PULL解析器も使用できます.Androidシステム
Pull解析器が内蔵されています.Pull解析器もイベント解析を採用しています.
Pull解析器の主なイベントと方法
XmlPullParser parser = Xml.newPullParser();//pull解析器の取得
parser.setInput(fileInputStream, “utf-8”);//xmlドキュメントをストリーム形式で解析器に渡す
int eventCode = parser.getEventType();//解析イベントから返されるcodeを取得
XmlPullParser.START_DOCUMENT//ドキュメントの開始
XmlPullParser.END_DOCUMENT//ドキュメントの終了
XmlPullParser.START_TAG//スタートノード
XmlPullParser.END_TAG//エンドノード
eventCode = parser.next();//次のノードの解析
parser.getName()/ノード名の取得
parser.getAttributeValue(null,“id”)/ノード属性の取得
parser.nextText()/testテキスト値の取得