pull,SAX和DOM解析的區別

  網上關於這三種解析方式的優缺點對比已經很多了,這裏我只展示代碼的實現過程,加深代碼印象:

  代碼結構如下圖所示:

1.users.xml的文件就是待解析的文件:

<users>
    <user id="1">
        <name>wuxianglong</name>
        <password>199098</password>
    </user>
    <user id="2">
        <name>wuwenyuan</name>
        <password>199189</password>
    </user>
</users>


2.user的代碼就比較簡單了:

public class User {

	public int id;
	public String name;
	public String password;
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", password=" + password
				+ "]";
	}

3.首先是pull解析的代碼實現:

public class PullParser {
	public static List<User> getUser(InputStream inputStream) throws Exception {

		List<User> users = null;
		User user = null;
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(inputStream, "UTF-8");

		int event = parser.getEventType();
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				users = new ArrayList<User>();
				break;
				
			case XmlPullParser.START_TAG:
				if ("user".equals(parser.getName())) {
					user = new User();
					user.setId(Integer.parseInt(parser.getAttributeValue(0)));
				}
				if (user != null) {
					if ("name".equals(parser.getName())) {
						user.setName(parser.nextText());
					}
					if ("password".equals(parser.getName())) {
						user.setPassword(parser.nextText());
					}
				}
				break;
				
			case XmlPullParser.END_TAG:
				if ("user".equals(parser.getName())) {
					users.add(user);
					user = null;
				}
				break;
			}
			event = parser.next();
		}

		return users;

	}
}

4.然後是SAX的解析代碼實現:

public class SaxHandler extends DefaultHandler {

	private ArrayList<User> users;
	private User user;
	private String content;
	
	/**
	 * @param users
	 */
	public SaxHandler(ArrayList<User> users) {
		this.users = users;
	}
	
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		content = new String(ch, start, length);
		super.characters(ch, start, length);
	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if ("user".equals(localName)) {
			user = new User();
			user.setId(Integer.valueOf(attributes.getValue("id")));
		}
		super.startElement(uri, localName, qName, attributes);
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if ("name".equals(localName)) {
			user.setName(content);
		} else if ("password".equals(localName)) {
			user.setPassword(content);
		} else if ("user".equals(localName)) {
			users.add(user);
		}
		
		super.endElement(uri, localName, qName);
	}
}

5.最後是Dom解析的代碼實現:

public class DomParser {
	public static List<User> getUser(InputStream inputStream) throws Exception{
		
		List<User> users = new ArrayList<User>();
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document =builder.parse(inputStream);
		Element root = document.getDocumentElement();        //獲取root根節點
		NodeList nodes = root.getElementsByTagName("user");   //獲取第一個父結點
		
		//遍歷user結點
		for(int i = 0;i < nodes.getLength(); i++){
			User user = new User();
			Element node = (Element) nodes.item(i);
			user.setId(Integer.parseInt(node.getAttribute("id")));
			NodeList childNodes = node.getChildNodes();
			
			//遍歷user下的所有子節點
			for(int j = 0;j < childNodes.getLength();j++){
				Node ChildNode = childNodes.item(j);
				if(ChildNode.getNodeType() == Node.ELEMENT_NODE){
					Element cNode = (Element) ChildNode;
					if("name".equals(cNode.getNodeName())){
						user.setName(cNode.getFirstChild().getNodeValue());
					}else if("password".equals(cNode.getNodeName())){
						user.setPassword(cNode.getFirstChild().getNodeValue());	
					}
						
				}
				users.add(user);
			}
			inputStream.close();
		}
		return users;
		
	}
}

6.調用他們就很簡單了,只是定義了一個垂直的LinearLayout的佈局,並實現三個按鈕分別對應pull,sax,dom解析按鈕,然後底下是一個解析顯示結果的TextView。

  主要功能實現的代碼是:

public class MainActivity extends Activity implements OnClickListener {

	private Button btn_sax;
	private Button btn_pull;
	private Button btn_dom;
	private TextView tv_content;
	private ArrayList<User> users;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		btn_sax = (Button) findViewById(R.id.btn_sax);
		btn_pull = (Button) findViewById(R.id.btn_pull);
		btn_dom = (Button) findViewById(R.id.btn_dom);
		tv_content = (TextView) findViewById(R.id.tv_content);

		btn_sax.setOnClickListener(this);
		btn_pull.setOnClickListener(this);
		btn_dom.setOnClickListener(this);

		users = new ArrayList<User>();
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_sax:

			doSAX(); // 進入解析

			break;
		case R.id.btn_pull:

			doPull();

			break;
		case R.id.btn_dom:

			doDom();
			
			break;
		}
	}

	/**
	 * 開始dom解析
	 */
	private void doDom() {
		
		try {
			InputStream input = this.getClass().getClassLoader()
					.getResourceAsStream("users.xml");
			List<User> users = DomParser.getUser(input);
			
			String domUserInfo = "";

			for (User user : users) {
				domUserInfo += user.toString();
			}
			tv_content.setText(domUserInfo);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 開始pull解析
	 */
	private void doPull() {

		try {
			InputStream input = this.getClass().getClassLoader()
					.getResourceAsStream("users.xml");
			new PullParser();
			List<User> users = PullParser.getUser(input);

			String PullUserInfo = "";

			for (User user : users) {
				PullUserInfo += user.toString();
			}
			tv_content.setText(PullUserInfo);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 開始sax解析
	 */
	private void doSAX() {
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			XMLReader reader = parser.getXMLReader();
			SaxHandler handler = new SaxHandler(users);
			reader.setContentHandler(handler);
			reader.parse(
			// new InputSource(this.getAssets().open("users.xml")));
			new InputSource(MainActivity.this.getClassLoader()
					.getResourceAsStream("users.xml")));
			
			String SaxUserInfo = "";

			for (User user : users) {
				SaxUserInfo += user.toString();
			}
			tv_content.setText(SaxUserInfo);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

解析過程大體就完成了,最後看下結果吧(只選取了一個結果展示):




附上代碼下載地址:

                                                             點擊這裏


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章