2種類のXML解析SAX解析とPull解析


SAX      , DOM        。

DOM原理:まずファイルをメモリに格納されたツリー構造に読み込みます.メモリのため、操作と管理が容易ですが、リソースと時間を無駄にします.
SAX原理:イベントに基づいて、xmlに読み込まれたノードは、ノード名に基づいて対応するデータを読み取り、リソースを消費することが少ないことを示します.しかし、ステータスがなく、持続的ではなく、データが保存されていなければ存在しません.
DOM 4 J:とても強くて.
JDOM:SAXのパッケージです.簡単な作成と解析に適しています.
今日使用した例は,アンドロイドが使用するSAXとアンドロイドが持参したPull解析である.
まず実験を見てみましょうxml
<?xml version="1.0" encoding= "UTF-8"?>
<citys>
       <city id= "23">
             <name>nice</name>
             <number>30</ age>
       </city>
      
       <city id="20">
             <name>work</name>
             <number>23</ age>
       </city>
</citys>

第一の解析方式SAX
/**
	 * SAX  
	 */
	@Override
	public List<City> parseXmlBySax(InputStream iis) throws Exception {
		List<City> list = new ArrayList<City>();
		SAXParserFactory spf = SAXParserFactory.newInstance();
		SAXParser parser = spf.newSAXParser(); //          

		CityContextHandler handler = new CityContextHandler();
		parser.parse(iis, handler); //                                   
		iis.close(); //        
		list = handler.getList();
		return list;
	}
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *        DefaultHandler
 *   startDocument()   startElement()  endElement()   characters()  
 *      xml    JavaBean         
 * 
 * @author suibian
 *
 */
public class CityContextHandler extends DefaultHandler {
	private List<City> list=null;
	private City city=null;
	private String targetname=null;
	
	public List<City> getList() {
		return list;
	}

	/**
	 *          
	 */
	@Override
	public void startDocument() throws SAXException {
		list=new ArrayList<City>();
	}

	/**
	 *        
	 *    city    
	 * 		 name set
	 * 		 location set
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if(localName.equals("citys")){   //          
			return;
		}
		 if(localName.equals("city")){
			 this.city=new City();
			 city.setId(Integer.valueOf(attributes.getValue("id")));
		 }
		 this.targetname=localName;
	}
	
	/**    
	 *    city          city=null
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		 if(localName.equals("city")){
			 list.add(city);
			 city=null;
		 }
		 this.targetname=null;
	}
	
	/**
	 *  JavaBean    
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String data=new String(ch,start,length);
		 if(this.targetname!=null&&(!(data.equals("")))){
			 if(this.targetname.equals("name")){
				 this.city.setName(data);
			 }else{
				 this.city.setNumber(data);
			 }
		 }
	}
}

第2のPull解析
/**
	 * Pull  
	 *   :                  
	 *      ,        
	 */
	@Override
	public  List<City> parseXmlByPull(InputStream iis) throws Exception {
		List<City> list = null;
		City city = null;
		XmlPullParser pull = XmlPullParserFactory.newInstance().newPullParser();
		pull.setInput(iis, "UTF-8");
		int event = pull.getEventType();
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				list = new ArrayList<City>();
				break;
			case XmlPullParser.START_TAG:
				if (pull.getName().equals("city")) {
					city = new City();
					city.setId(Integer.valueOf(pull.getAttributeValue(0)));
				}
				if (pull.getName().equals("name")) {
					city.setName(pull.nextText());
				}

				if (pull.getName().equals("number")) {
					city.setNumber(pull.nextText());
				}
				break;
			case XmlPullParser.END_TAG:
				if (pull.getName().equals("city")) {
					list.add(city);
					city = null;
				}
				break;
			}
			event = pull.next();
		}
		return list;
	}

これは私を困惑させて久しくて、誤りが現れてどうしてsetup()must be......@1 nullなんて覚えていません.これはテストを提示するときに1つのスレッドに入れなければ解析できません.その後、https://github.com/blogやっと見つけた答えは、英語のレベルが無理に読めてよかった. 
DOM解析についてはあまり話さないが、とにかく言いたいのは、これはただの道具で、使うだけで、原理がわかったらいいということだ. 
私は菜鳥です.道にいます. 
2015年5月17日23:48:20