`

DOM方式解析xml文件3(assets中xml文件)

阅读更多
这个例子是进一步熟悉DOM解析xml文件的方法,附带基础的文档说明,大部分内容来自于EOE论坛的帖子消息:
先直接上代码:
1.DomStudy.java文件
package cn.com;

import java.io.IOException;
import java.io.InputStream;

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

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.app.Activity;
import android.os.Bundle;

public class DomStudy extends Activity {

	String xml = "";

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		try {
			parseXml();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void parseXml() throws IOException {

		// 建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象
		// 使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程序,
		// 当DocumentBuilderFactory类的静态方法newInstance()被调用时,
		// 它根据一个系统变量来决定具体使用哪一个解析器
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

		try {
			DocumentBuilder db = dbf.newDocumentBuilder();

			InputStream is = getAssets().open("test.xml");

			// parse()方法
			// 接受一个XML文档名作为输入参数
			// 接受一个输入流
			// 返回一个Document对象,代表了一个XML文档的树模型
			// 以后所有的对XML文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了
			Document doc = db.parse(is);

			NodeList nl = doc.getElementsByTagName("message");

			System.out.println("nl.getLength() ==========" + nl.getLength());
			Node my_node = nl.item(0);

			if (my_node.hasAttributes()) {
				System.out.println("++++++++++++++++++"
						+ my_node.getAttributes().getNamedItem("id")
								.getNodeValue());
			}

			String message = my_node.getFirstChild().getNodeValue();

			System.out.println("**********8888message ==" + message);

		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

2.assets文件夹中test.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<messages>
	<message id="1">Good-bye serialization, hello Java!</message>
	<message id="2">Good-bye serialization, hello Java!</message>
	<message id="3">Good-bye serialization, hello Java!</message>
</messages>

    下面对这个例子进行必要的文档分析:
DOM是Document Object Model的缩写,即文档对象模型.
xml数据将组织为一棵树,所以DOM就是对这棵树的对象描述.
下面通过一个简单的例子进行学习:
<?xml version="1.0" encoding="UTF-8"?>
<messages>
<message>Good-bye serialization, hello Java!</message>
</messages>

step 1:我们需要建立一个解析器工厂,以利用这个工厂获得一个具体的解析器对象:
       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
PS:使用DocumentBuilderFactory的目的是为了创建与具体解析器无关的程序,当调用
   newInstance()的静态方法时,它会根据一个系统变量来决定具体使用那个解析器,
   又因为所有解析器都服从于JAXP所定义的接口,所以无论具体使用那个解析器,代码都
   是一样的.所以在不同的解析器之间切换时,只需要修改系统变量的值,而不用更改任何代码.

step 2:当获得一个工厂对象后,使用它的静态方法newDocumentBuilder()就可以获得一个
       DocumentBuilder对象,这个对象代表了具体的DOM解析器,但具体是哪一种解析器,
       微软的,IBM的,对于程序而言,并不重要;
       DocumentBuilder db = dbf.newDocumentBuilder();

step 3:DocumentBuilder的parse()方法接受一个XML文档名作为输入参数,返回一个Document对象,
       这个Document对象就代表了一个XML文档的树模型。以后所有的对XML文档的操作,都与解析
       器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就
       是由DOM所定义的了
       Document doc = db.parse("c:/xml/message.xml");
       也可以在android中这样定义:
       在assets文件夹中建立一个test.xml文件,就是上述xml内容,
       InputStream is = getAssets().open("test.xml");
       然后通过Document doc = db.parse(is);获取这个Document对象进行操作:
PS:Jaxp支持W3C所推荐的DOM 2。如果你对DOM很熟悉,那么下面的内容就很简单了:只需要按照DOM的
   规范来进行方法调用就可以。当然,如果你对DOM不清楚,也不用着急,后面我们会有详细的介绍。
   在这儿,你所要知道并牢记的是:DOM是用来描叙XML文档中的数据的模型,引入DOM的全部原因就
   是为了用这个模型来操作XML文档的中的数据。DOM规范中定义有节点(即对象)、属性和方法,
   我们通过这些节点的存取来存取XML的数据。

   从Document对象开始,我们就可以开始我们的DOM之旅了。使用Document对象的getElementsByTagName()
   方法,我们可以得到一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList
   对象,观其名而知其意,所代表的是一个Node对象的列表
step 4:  NodeList nl = doc.getElementsByTagName("message");
       我们通过这样一条语句所得到的是XML文档中所有<message>标签对应的Node对象的一个列表。
       然后,我们可以使用NodeList对象的item()方法来得到列表中的每一个Node对象
       Node my_node = nl.item(0);
       当一个Node对象被建立之后,保存在XML文档中的数据就被提取出来并封装在这个Node中了。在这个例子
       中,要提取Message标签内的内容,我们通常会使用Node对象的getNodeValue()方法:
       String message = my_node.getFirstChild().getNodeValue();

PS:请注意,这里还使用了一个getFirstChild()方法来获得message下面的第一个子Node对象。虽然在message标
签下面除了文本外并没有其它子标签或者属性,但是我们坚持在这里使用getFirseChild()方法,这主要和W3C对
DOM的定义有关。W3C把标签内的文本部分也定义成一个Node,所以先要得到代表文本的那个Node,我们才能够使
用getNodeValue()来获取文本的内容。现在,既然我们已经能够从XML文件中提取出数据了,我们就可以把这些
数据用在合适的地方,来构筑应用程序
分享到:
评论

相关推荐

    Android Dom解析XML

    Android使用Dom方式解析XML,虽然xml文件太大时不建议用dom方式解析,但是如果文件比较小,也不失为一种选择。项目中xml放在assets文件夹下,view绑定使用butterknife

    Android XML解析(DOM、PULL、SAX三种方式)

    提供了android中使用dom、pull、sax三种方式进行xml解析,xml文件放置在assets文件夹下,view绑定使用butterknife

    Android开发之DOM解析xml文件的方法

    本文实例讲述了Android中DOM解析xml文件的方法。分享给大家供大家参考,具体如下: 一、在assets文件中写xml文件 &lt;?xml version=1.0 encoding=UTF-8?&gt; 李明 &lt;age&gt;30 李向梅 &lt;age&gt;25 二、在...

    Android XML数据的三种解析方式

    本篇文章包含以下内容: ...DOM解析XML文件时,会将XML文件的所有内容读取到内存中(内存的消耗比较大),然后允许您使用DOM API遍历XML树、检索所需的数据 一、在Assets文件夹中模拟创建XML文件 &lt;name

    XMLTest.zip

    Android 中通过三种方式XML DOM、PULL、SAX对assets中的XML文件进行解析。 具体的XML相关知识可以了解此文章:https://editor.csdn.net/md?articleId=106274240

    Android集成主流优秀第三方组件框架

    文件操作工具类(ToolFile.java),assets/raw/xml/shrePerface/等文件读写API 地图定位工具类(ToolLocation.java),读取GPS状态、请求定位、获取经纬度等方法 社会化分享工具类(ToolShareSDK.java),各大开发平台...

    集成目前Android主流优秀第三方组件

    文件操作工具类(ToolFile.java),assets/raw/xml/shrePerface/等文件读写API 地图定位工具类(ToolLocation.java),读取GPS状态、请求定位、获取经纬度等方法 社会化分享工具类(ToolShareSDK.java),各大开发平台...

    Android例子源码集成安卓主流优秀第三方组件框架.zip

    文件操作工具类(ToolFile.java),assets/raw/xml/shrePerface/等文件读写API 地图定位工具类(ToolLocation.java),读取GPS状态、请求定位、获取经纬度等方法 社会化分享工具类(ToolShareSDK.java),各大开发...

    集成安卓主流优秀第三方组件框架.zip

    文件操作工具类(ToolFile.java),assets/raw/xml/shrePerface/等文件读写API 地图定位工具类(ToolLocation.java),读取GPS状态、请求定位、获取经纬度等方法 社会化分享工具类(ToolShareSDK.java),各大开发...

    Java资源加载库Azzet.zip

     // loads from TcpSource saved as "tcp"支持的格式包括:JSON (org.magnos.asset.json.JsonValue)XML (org.w3c.dom.Document)PROPERTIES/XML/CONFIG (java.util.Properties, org.magnos.asset.props.Config...

    async-preloader:使用ES2017 asyncawait和获取的资产预加载器

    诸如node-fetch和xmldom类的Polyfill可能会派上用场。 预加载项目并检索它们 import AsyncPreloader from "async-preloader" ;const items = [ { id : "myDefaultFile" , src : "assets/default" } , { id : "my

    Gamebryo.3.0 LightSpeed

    附件为链接文件 Gamebryo.3.0 LightSpeed 详情请自行搜索,该资源 来源于互联网。 安装后目录,大小为10G左右 ├─Build │ ├─CoreRuntime │ │ └─Win32 │ │ ├─VC80 │ │ │ └─Property Sheets │ │ └...

Global site tag (gtag.js) - Google Analytics