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ディレクトリの下に配置します.
<?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;
    }
     
}