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()
解析ツールクラス
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テキスト値の取得
ドライバ、イベント定義は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テキスト値の取得