Androidカリキュラム11解析xml(Dom解析)
9105 ワード
AndroidプログラムではXml解析はJavaとほぼ同じで,最もよく用いられるのはSAX,DOM,PULLの3つの解析方式である.Androidにはpull解析方式が内蔵されています.これもandroidが推奨する解析方式です.次はこの3つの使い方を見てみましょう.
1)SAX:(Simple API for XML)この解析方式はイベントのモデルに基づいている.一般的には、XMLファイルは、ロード中に異なるノードにロードされると、それに応じて異なる方法で処理されます.1回のロードに属します.任意のサイズのXMLファイルを処理することができ、メモリに対する要求は非常に低い.SAXはファイルを読み取る方法を採用しているからだ.つまり、テキストファイルが読んでいるとき、読み終わったら、何も保存されていないからだ.もちろん、解析中に中断できず、XMLファイルを読み取るだけで修正できず、符号化上も比較的複雑で理解しにくいという欠点もあります.一般的な方法:
void startDocument()/ドキュメント開始時にこのメソッドをトリガー
void endDocument()/ドキュメント終了時
void startElement(String uri,String localName,String qName,Attributes atts)/要素開始
void endElement(String uri,String localName,String qName)/要素終了
void characters(char[]ch,int start,int length)/テキストノード
SAX解析を作成するには:
(1)システムのデフォルト値でXML Reader(解析器)を作成する:
XMLReader reader = XMLReaderFactory.createXMLReader();
(2)与えられたクラス名からXML Readerを作成する:
XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
(3)javaxを用いる.xml.parsersパッケージのSAXParserFactoryクラスとSAXParserクラスの作成:
SAXParserFactory spFactory = SAXParserFactory.newInstance();
SAXParser sParser = spFactory.newSAXParser();
2)DOM:(Document Object Model)オブジェクトベース、またはツリーベースのドキュメントオブジェクトモデル.2回のロードに属し、まずドキュメントをメモリにロードし、2回目にドキュメントを解析してツリーを形成します.ドキュメントが大きすぎるとメモリの消費量が大きくなります.しかし、解析中にファイルツリーを変更したり、ファイルツリーの任意の部分を勝手に保存したりすることができ、比較的理解しやすいという利点もあります.
3)Pull解析:androidにはpull解析パッケージが内蔵されている.これもandroidプログラムで推奨されるxml解析方式である.その字面から、その長所、pull、引く意味がわかります.私はどんな資源がほしいですか.私はどんな資源を持っていますか.xmlファイルの一部だけが必要で、一部を引きます.これにより、リソースを節約し、効率を向上させます.もちろんJ 2 EEではPull解析も使用できます.Pull解析も非常に分かりやすい.
xmlファイルを先にリストします:assetsディレクトリの下に配置します.
マッピングクラスをリストします.
解析を開始し、
まずDOMメソッドを示します.
Pull解析コード:
1)SAX:(Simple API for XML)この解析方式はイベントのモデルに基づいている.一般的には、XMLファイルは、ロード中に異なるノードにロードされると、それに応じて異なる方法で処理されます.1回のロードに属します.任意のサイズのXMLファイルを処理することができ、メモリに対する要求は非常に低い.SAXはファイルを読み取る方法を採用しているからだ.つまり、テキストファイルが読んでいるとき、読み終わったら、何も保存されていないからだ.もちろん、解析中に中断できず、XMLファイルを読み取るだけで修正できず、符号化上も比較的複雑で理解しにくいという欠点もあります.一般的な方法:
void startDocument()/ドキュメント開始時にこのメソッドをトリガー
void endDocument()/ドキュメント終了時
void startElement(String uri,String localName,String qName,Attributes atts)/要素開始
void endElement(String uri,String localName,String qName)/要素終了
void characters(char[]ch,int start,int length)/テキストノード
SAX解析を作成するには:
(1)システムのデフォルト値でXML Reader(解析器)を作成する:
XMLReader reader = XMLReaderFactory.createXMLReader();
(2)与えられたクラス名からXML Readerを作成する:
XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
(3)javaxを用いる.xml.parsersパッケージのSAXParserFactoryクラスとSAXParserクラスの作成:
SAXParserFactory spFactory = SAXParserFactory.newInstance();
SAXParser sParser = spFactory.newSAXParser();
2)DOM:(Document Object Model)オブジェクトベース、またはツリーベースのドキュメントオブジェクトモデル.2回のロードに属し、まずドキュメントをメモリにロードし、2回目にドキュメントを解析してツリーを形成します.ドキュメントが大きすぎるとメモリの消費量が大きくなります.しかし、解析中にファイルツリーを変更したり、ファイルツリーの任意の部分を勝手に保存したりすることができ、比較的理解しやすいという利点もあります.
3)Pull解析:androidにはpull解析パッケージが内蔵されている.これもandroidプログラムで推奨されるxml解析方式である.その字面から、その長所、pull、引く意味がわかります.私はどんな資源がほしいですか.私はどんな資源を持っていますか.xmlファイルの一部だけが必要で、一部を引きます.これにより、リソースを節約し、効率を向上させます.もちろんJ 2 EEではPull解析も使用できます.Pull解析も非常に分かりやすい.
xmlファイルを先にリストします:assetsディレクトリの下に配置します.
<?xml version="1.0" encoding="utf-8"?>
<rivers>
<river name=" " length="605">
<introduction>
, , “ ” 。 、 、 、 , 214 , 2217 , 。
</introduction>
<imageurl>
http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg
</imageurl>
</river>
</rivers>
マッピングクラスをリストします.
import java.io.Serializable;
public class River implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public String getIntroduction() {
return introduction;
}
public void setIntroduction(String introduction) {
this.introduction = introduction;
}
public String getImageurl() {
return imageurl;
}
public void setImageurl(String imageurl) {
this.imageurl = imageurl;
}
private int length;
private String introduction;
private String imageurl;
}
解析を開始し、
まずDOMメソッドを示します.
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import entity.River;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_table);
try {
InputStream is = this.getResources().getAssets().open("river.xml");
List<River> rivers = this.getRiversFromXml( is);
System.out.println(rivers.size());
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//
/**
* fileName: xml
* @throws IOException
* @throws SAXException
* @throws ParserConfigurationException
*/
public List<River> getRiversFromXml( InputStream inputStream) throws SAXException, IOException, ParserConfigurationException{
DocumentBuilderFactory f=DocumentBuilderFactory.newInstance();
DocumentBuilder builder = f.newDocumentBuilder();
Document doc=builder.parse(inputStream);
NodeList list=doc.getElementsByTagName("river");
List<River> rivers = new ArrayList<River>();
for(int i=0;i<list.getLength();i++){
Element el=(Element) list.item(i);
River river = new River();
river.setImageurl(this.getSubelementTextContentByName(el, "imageurl"));
river.setIntroduction(this.getSubelementTextContentByName(el, "introduction"));
river.setLength(Integer.parseInt( el.getAttribute("length")));
river.setName(el.getAttribute("name"));
rivers.add(river) ;
}
return rivers;
}
private String getSubelementTextContentByName(Element el, String name) {
NodeList list=el.getElementsByTagName(name);
Element e=(Element) list.item(0);
return e.getTextContent();
}
}
Pull解析コード:
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Xml;
import android.view.Menu;
import entity.River;
public class MainActivity extends Activity {
private String tagName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_table);
InputStream is;
try {
is = this.getResources().getAssets().open("river.xml");
List<River> rivers = this.getRiversFromXml( is);
System.out.println(rivers.size());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//
/**
* fileName: xml
* @throws XmlPullParserException
* @throws IOException
*/
public List<River> getRiversFromXml( InputStream in) throws XmlPullParserException, IOException {
List<River> rivers=null;
River river=null;
XmlPullParser parser=Xml.newPullParser();
parser.setInput(in, "utf-8");
//
int eventType=parser.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
switch(eventType){
//
case XmlPullParser.START_DOCUMENT:
rivers=new ArrayList<River>();
break;
case XmlPullParser.START_TAG:
tagName = parser.getName();
if("river".equals(tagName)){
river=new River();
river.setName( parser.getAttributeValue(0));
river.setLength(Integer.parseInt( parser.getAttributeValue(1)));
}else if("introduction".equals(tagName)){
river.setIntroduction( parser.nextText());
}else if("imageurl".equals(tagName)){
river.setImageurl( parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if("river".equals(parser.getName())){
rivers.add(river);
}
break;
}
eventType=parser.next();
}
return rivers;
}
}