edison_cool911 发表于 2013-1-15 02:25:12

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. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);try {parseXml();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.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文件中提取出数据了,我们就可以把这些
数据用在合适的地方,来构筑应用程序
页: [1]
查看完整版本: DOM方式解析xml文件3(assets中xml文件)