Android中XML解析-Dom解析

Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM、SAX以及PULL三种方式,本文就简单以Dom解析为例,解析XML, DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大,手机CPU处理能力比PC差,因此在处理效率方面就相对差了,使用Dom解析就不是太合适了。

基础维护

首先下assets目录下新建一个Book.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<Books>

    <Book name="康师傅的亿万帝国" >

        <Title>
    据周元根的小学同学回忆,大约7岁那年,周元根开始读小学,由于和别人重名,于是改了名字。但他在村里一直沿用“周元根”这个名字,周家祖坟的5块墓碑上,刻的也是“周元根”这个名字。

        </Title>

        <Picture>
     http://p.qpic.cn/ninja/0/ninja1406636943/0

        </Picture>
    </Book>

    <Book name="徐才厚受贿额特别巨大" >

        <Title>
   根据最高人民检察院授权,军事检察院对中央军委原副主席徐才厚以涉嫌受贿犯罪立案侦查。2014年10月27日,对该案侦查终结,移送审查起诉。

        </Title>

        <Picture>
http://www.sinaimg.cn/dy/slidenews/1_img/2014_44/2841_506865_709392.jpg

        </Picture>
    </Book>
    <Book name="发改委副司长魏鹏远" >

        <Title>
    最高人民检察院反贪污贿赂总局局长徐进辉今日表示,煤炭司副司长魏鹏远家中搜查发现现金折合人民币2亿余元,成为建国以来检察机关一次起获赃款现金数额最大的案件。

        </Title>

        <Picture>
    http://img1.cache.netease.com/catchpic/D/DC/DCB2315FD0F50C665BB1474768192642.jpg

        </Picture>
    </Book>

</Books>

XML存储的方式其实和类存储的是类似的,这个时候建一个对应的Book类:

public class Book {
	private String title;
	private String picture;
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getPicture() {
		return picture;
	}
	public void setPicture(String picture) {
		this.picture = picture;
	}
}

 Book布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/itemImage"
        android:layout_width="40dp"
        android:layout_height="60dp"
        android:src="@drawable/fight"
       />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="10dp"
       >

        <TextView
            android:id="@+id/itemTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="标题"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/itemText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            android:text="xxxxxxxxx" />
    </LinearLayout>

</LinearLayout>

Demo实现

现在最主要的是将XML的Book转换成一个Book集合:

	public List<Book> getBooks(InputStream stream) {
		List<Book> list = new ArrayList<Book>();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			// 获取XML文档结构
			Document document = builder.parse(stream);
			// 获取根节点
			Element rootElement = document.getDocumentElement();
			NodeList nodeList = rootElement.getElementsByTagName("Book");
			for (int i = 0; i < nodeList.getLength(); i++) {
				Book book = new Book();
				// Node转成Element
				Element element = (Element) nodeList.item(i);
				book.setName(element.getAttribute("name"));
				Element eleTitlElement = (Element) element
						.getElementsByTagName("Title").item(0);
				String title = eleTitlElement.getFirstChild().getNodeValue();
				Element elePicElement = (Element) element.getElementsByTagName(
						"Picture").item(0);
				String picString = elePicElement.getFirstChild().getNodeValue();
				book.setTitle(title);
				book.setPicture(picString);
				list.add(book);
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;

	}

 1.通过DocumentBuilderFactory工厂类实例化一个工厂,通过工厂的newDocumentBuilder()方法实例化一个DocumentBuilder .通过创建好的 DocumentBuilder 对象的 parse(InputStream) 方法就可以解析我们的xml文档,然后返回的是一个Document的对象,这个Document对象代表的就是我们的整个xml文档。

2.获取整个xml的Document对象后,我们可以获得其下面的各个元素节点(Element),同样每个元素节点可能又有多个属性(Attribute),根据每个元素节点我们又可以遍历该元素节点下面的子节点等等。

MainActivity启动方法中的调用:

		InputStream inputStream = null;
		try {
			inputStream = inputStream = MainActivity.this.getResources().getAssets().open("Book.xml");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		list = getBooks(inputStream);
		View view = getLayoutInflater().inflate(R.layout.activity_main, null);
		ListView listView = (ListView) findViewById(R.id.list_dom);
		listView.setAdapter(new testAdapter());

testAdapter的写法:

	class testAdapter extends BaseAdapter {

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			Book book = (Book) list.get(position);
			View view = null;
			if (convertView == null) {
				LayoutInflater layoutInflater = getLayoutInflater();
				view = layoutInflater.inflate(R.layout.book, null);
			} else {
				view = convertView;
			}
			// ImageView imageView = (ImageView)
			// view.findViewById(R.id.itemImage);

			// imageView.setImageResource(BIND_ABOVE_CLIENT);
			TextView titleView = (TextView) view.findViewById(R.id.itemTitle);
			titleView.setText(book.getName());

			TextView contentView = (TextView) view.findViewById(R.id.itemText);
			contentView.setText(book.getTitle());
			return view;
		}

	}

周末看博客的都是好孩子,祝大家周末愉快~

时间: 2024-08-27 07:33:36

Android中XML解析-Dom解析的相关文章

android中xml的pull解析

xml的pull解析:    //类加载器加载xml文件 InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("weather.xml"); //生成xml的pull解析器 XmlPullParser pull = Xml.newPullParser(); try { //设置输入流 pull.setInput(is, "utf-8"); //解析器当前处于的状态 int

Android中XML数据解析

转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML(Extensible Markup Language的缩写,意为可扩展的标记语言),它是一种元标记语言,即定义了用于定义其他特定领域有关语义的.结构化的标记语言,这些标记语言将文档分成许多部件并对这些部件加以标识.XML 文档定义方式有:文档类型定义(DTD)和XML Schema.DTD定义了文

android 中Xml里面的id重名问题

情况一:同个一个Xml文件中的同名 在同个一个Xml文件的中若同名了,则前一个有效,而后一个无效 情况二:在不同的Xml 文件中的同名 在不同Xml文件的Id若同名了,两者都有效的. 当android的工程越来越大.xml文件越来越多时,避免不了两个xml文件中同 样的组件使用同样的id名字,gen目录下的R.java文件中,有关id的声明都在id的class中,即public static final class id{}:当两个xml文件中同样的组件,比如Button,有可能很多个文件中,都

Android中XML解析-PULL解析

前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 SAX 解析器相似,也是事件触发的.Pull解析方式让应用程序完全控制文档该怎么样被解析,比如开始和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分处理.事件将作为数值代码

Android中XML解析

package com.example.thebroadproject; public class Book { private int id; private String name; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setN

iOS中的数据解析(XML,JSON),SAX解析,DOM解析

第三方 SAT解析 #import "SAXTableViewController.h" #import "Student.h" @interface SAXTableViewController ()<NSXMLParserDelegate> @property (nonatomic, retain) NSMutableArray *dataSourse; // 存储学生对象 @property (nonatomic, retain) Student

iOS开发中XML的DOM和SAX解析方法

一.介绍 dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文件.xml文件很大时,建立的“树”也会大,所以会大量占用内存. sax解析器核心是事件处理机制.例如解析器发现一个标记的开始标记时,将所发现的数据会封装为一个标记开始事件,并把这个报告给事件处理器,事件处理器再调用方法(startElement)处理发现的数据.下面我们尝试一下SAX和DOM解析:

Android中使用PULL方式解析XML文件

Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理.当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值. 下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件.先看下如下工程的目录结构: 按以下步骤进行操作: [1]

android基础----&gt;XMl数据的解析

在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据.解析XML 格式的数据其实也有挺多种方式的,本节中我们学习比较常用的两种,Pull解析和SAX 解析. 目录导航 Pull解析的用法 Pull解析的代码 Sax解析的用法 Sax解析的代码 Sax与Pull的比较 友情链接 Pull解析的用法 一.我们常用的五个事件: START DOCUMENT:文档开始时,解析器还没有读取任何数据 START_TAG:解析到标签开头 TEXT:解析到元素的内容 E