PULLとSAX解析xmlファイル
10568 ワード
最近androidについて勉強していますが、今日はPULLとSAXの2つの異なる方法でxmlファイルを解析することについて見ました.ここで簡単にまとめます.
SAXは「プッシュ」に基づく解析方式で、登録されたイベントプロセッサに自動的にイベントをプッシュして処理するので、イベント処理のアクティブな終了を制御することはできません.SAX方式でxmlドキュメントを解釈する場合、一度にドキュメント全体をメモリに読み込んで解析するのではなく、ドキュメントを読み取る過程で解析しますが、SAXはxmlドキュメントを解析する際に、ドキュメント内のすべてのノードを遍歴します.したがって、xmlドキュメントの前の部分が必要な場合、この方法を採用すると、リソースが浪費されます.
PULLは「プル」ベースの解析方式で、アプリケーションは私たち自身のニーズに応じて解析器の読み取りを制御することができます.アプリケーションコードをプロアクティブに解析器からイベントを取得することで、必要なコンテンツを取得した後、解析を終了できます.
次に、xmlファイルを解析する2つの方法の簡単な例について説明します.1.解析する必要があるxmlファイルは以下の通りです.
2.PULL方式でxmlファイルを解析する
3.SAX方式でxmlファイルを解析する
SAXは「プッシュ」に基づく解析方式で、登録されたイベントプロセッサに自動的にイベントをプッシュして処理するので、イベント処理のアクティブな終了を制御することはできません.SAX方式でxmlドキュメントを解釈する場合、一度にドキュメント全体をメモリに読み込んで解析するのではなく、ドキュメントを読み取る過程で解析しますが、SAXはxmlドキュメントを解析する際に、ドキュメント内のすべてのノードを遍歴します.したがって、xmlドキュメントの前の部分が必要な場合、この方法を採用すると、リソースが浪費されます.
PULLは「プル」ベースの解析方式で、アプリケーションは私たち自身のニーズに応じて解析器の読み取りを制御することができます.アプリケーションコードをプロアクティブに解析器からイベントを取得することで、必要なコンテンツを取得した後、解析を終了できます.
次に、xmlファイルを解析する2つの方法の簡単な例について説明します.1.解析する必要があるxmlファイルは以下の通りです.
<apps>
<app>
<id>1id>
<name>aname>
<version>1.0version>
app>
<app>
<id>2id>
<name>bname>
<version>1.1version>
app>
apps>
2.PULL方式でxmlファイルを解析する
// pull xml
private void parseXMLWithPull(String xmlData){
String id = "";
String name = "";
String version = "";
try {
// pull
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(xmlData));
//
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
//
String nodeName = parser.getName();
switch (eventType){
//
case XmlPullParser.START_TAG:
if("id".equals(nodeName)){
id = parser.nextText();
}else if("name".equals(nodeName)){
name = parser.nextText();
}else if("version".equals(nodeName)){
version = parser.nextText();
}
break;
//
case XmlPullParser.END_TAG:
if("app".equals(nodeName)){
Log.d("Main2Activity",id);
Log.d("Main2Activity", name);
Log.d("Main2Activity", version);
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
3.SAX方式でxmlファイルを解析する
public class MyHandler extends DefaultHandler{
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
public void startDocument() throws SAXException {
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
nodeName = localName;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if("id".equals(nodeName)){
id.append(ch, start, length);
}else if("name".equals(nodeName)){
name.append(ch, start, length);
}else if("version".equals(nodeName)){
version.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("app".equals(nodeName)){
Log.d("ContentHandler", id.toString());
Log.d("ContentHandler", name.toString());
Log.d("ContentHandler", version.toString());
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
// SAX xml
private void parseXMLWithSax(String xmlData){
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = null;
try {
xmlReader = factory.newSAXParser().getXMLReader();
MyHandler myHandler = new MyHandler();
xmlReader.setContentHandler(myHandler);
xmlReader.parse(new InputSource(new StringReader(xmlData)));
}catch (Exception e){
e.printStackTrace();
}
}