Android Dom解析xml

先看一个图:
android sax

我们来实现这张图的效果,只不过我们改为了dom技术,至于上面的图片上为什么显示的是sax解析而不是xml解析,这个不是主要的,只是个样子而已,看代码结构图:

android代码结构图

main.xml

beauties.xml

activity代码

package cn.com.dom;

import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class DomParseXmlTest extends Activity {
	// 存储最终在前台显示的内容
	private String result = "";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		InputStream inputStream = this.getClassLoader().getResourceAsStream(
				"beauties.xml");
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse(inputStream);
			// 获取根节点
			Element root = document.getDocumentElement();

			parse(root);

			for (Beauty b : beautyList) {
				result += b.toString();
			}

			TextView textView = (TextView) findViewById(R.id.textView);
			textView.setText(result);

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

	private Beauty beauty = null;
	private ArrayList beautyList = new ArrayList();

	/**
	 * 
	 * @param element 将要进行遍历的节点
	 */
	private void parse(Element element) {
		NodeList nodelist = element.getChildNodes();
		int size = nodelist.getLength();
		for (int i = 0; i < size; i++) {
			// 获取特定位置的node
			Node element2 = (Node) nodelist.item(i);
			
            /** getNodeName获取tagName,例如thinking in android这个Element的getNodeName返回book
			 * getNodeType返回当前节点的确切类型,如Element、Attr、Text等
			 * getNodeValue 返回节点内容,如果当前为Text节点,则返回文本内容;否则会返回null
			 * getTextContent 返回当前节点以及其子代节点的文本字符串,这些字符串会拼成一个字符串给用户返回。例如
			 * 对thinking in android12.23调用此方法,则会返回“thinking in android12.23”
			 */
            String tagName = element2.getNodeName();
			if (tagName.equals("beauty")
					&& element2.getNodeType() == Document.ELEMENT_NODE) {
				beauty = new Beauty();
				Log.i("通知:", "创建beauty");
				if (element2.getNodeType() == Document.ELEMENT_NODE) {
					parse((Element) element2);
				}
				Log.i("通知:", "添加beauty");
				beautyList.add(beauty);
			}

			if (tagName.equals("name")) {
				String name = element2.getTextContent();
				Log.i("通知:", "name" + name);
				beauty.setName(name);
			}
			if (tagName.equals("age")) {
				String age = element2.getTextContent();
				Log.i("通知:", "age" + age);
				beauty.setAge(age);
			}
		}
	}

	/**
	 * 
	 * @author chenzheng_java 这里使用内部类是为了效率考虑,内部类要比单独顶一个bean类更加的高效以及节约空间
	 * 
	 */
	private class Beauty {
		String name;
		String age;

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public String getAge() {
			return age;
		}

		public void setAge(String age) {
			this.age = age;
		}

		@Override
		public String toString() {
			return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";
		}
	}
}

其他都为默认。解析xml就完成了。执行,然后就可以看到正确的结果了。

DOM解析虽然在android中我们并不推荐使用,但是这并不代表着不可以实现。dom的原理是把xml文件的各种部分都看成是节点,所有的节点因为层级关系最后形成了一颗节点树。而Android Dom的解析方式便是在内存中生存这棵树,并允许用户进行相关的操作。

这里列出几个dom中经常用到的方法:

Node接口的常用方法

一个节点可以调用
short getNodeType()
方法返回一个表示节点类型的常量(Node接口规定的常量值),例如,对于Element节点,getNodeType()方法返回的值为:
Node.ELEMENT_NODE

节点可以调用
NodeList getChildNodes()
返回一个由当前节点的所有子节点组成的NodeList对象。

节点调用
Node getFirstChild()
返回当前节点的第一个子节点。

节点调用
Node getLastChild()
返回当前节点的最后一个子节点。

节点可以调用
NodeList getTextContent()
返回当前节点及所有子孙节点中的文本内容。

暂无评论
  • 1:请一针见血的评论。
  • 2:评论需要审核通过后才能显示。
  • 3:评论字数限制在1000字以内。
  • 当前字数:0
热门文章
推荐文章
随机文章
关于本站 - 广告服务 - 版权声明 - 联系我们 - 友情链接 - 网站地图 - 帮助中心