`

Android之资源文件存取及DOM解析(3)

阅读更多

                   学到这里我们就想到了绝对不能动的R.java文件,对于安卓程序员来说,那是个禁区,是决定不能改动的,那有没有想狮子口拔牙想要把它读出来呢,来我们来试一下。

资源文件的ID都生成在R文件,通过import android.content.res.Resources;将之读出,获取id方法为:

 r=super.getResources();//操作资源

 InputStream input=r.openRawResource(R.raw.mybook);

现在我们自res文件下新建一个raw文件来存出一个资源  mybook.txt,我们实现将之读出,注意定义文本格式选择utf-8,否则读出会是乱码。



 将布局文件设为utf-8,右键properties

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
   
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
   />

</LinearLayout>

Activity代码:

 

public class MainActivity extends Activity {

	private TextView text=null;
	private Resources r=null;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.text=(TextView)super.findViewById(R.id.msg);
		r=super.getResources();//操作资源
		InputStream input=r.openRawResource(R.raw.mybook);//读取ID
		Scanner scan=new Scanner(input);
		StringBuffer buf=new StringBuffer();//读取数据
		while(scan.hasNext()){           //循环读取
			buf.append(scan.next()).append("\n");
		}
		scan.close();
		
		try {
			input.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.text.setText(buf.toString());
	}

 

实现效果为:



 

  • DOM

使用文件存储固然方便,但是如果数据多了以后,就不太好管理了,现在我们把数据存到xml文件形式进行存储,然后这个格式必须进行解析,解析就要用到DOM解析。

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

现在我们实现一个目前我们第一个人机交互保存、

就是用户输入资料,程序保存

并必要时可以读出供用户阅览

 

定义DOM,也就是布局文件去解析:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/TableLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   
    tools:context=".MainActivity" >

    <TableRow
        android:id="@+id/TableRow01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名" />

        <EditText
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10" />
    </TableRow>

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/邮箱"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />

        <EditText
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10" >

            <requestFocus />
        </EditText>

    </TableRow>

    <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/but"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="保存" />

    </TableRow>

</TableLayout>

  Activity代码:

 

public class MainActivity extends Activity {
	private EditText name = null ;
	private EditText email = null ;
	private Button but = null ;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_main);
		this.name = (EditText) super.findViewById(R.id.name) ;
		this.email = (EditText) super.findViewById(R.id.email) ;
		this.but = (Button) super.findViewById(R.id.but) ;
		this.but.setOnClickListener(new OnClickListenerImpl()) ;
	}
	private class OnClickListenerImpl implements OnClickListener{

		@Override
		public void onClick(View v) {
			if (!Environment.getExternalStorageState().equals(
					Environment.MEDIA_MOUNTED)) {	// 不存在不操作
				return; // 返回到程序的被调用处
			}
			File file = new File(Environment.getExternalStorageDirectory()
					+ File.separator + "eedata" + File.separator
					+ "ee.xml");	// 要输出文件的路径
			if (!file.getParentFile().exists()) { // 父路径不存在
				file.getParentFile().mkdirs() ;	// 创建父文件夹
			}
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
			DocumentBuilder builder = null ;
			try {
				builder = factory.newDocumentBuilder() ;
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}
			Document doc = null ;
			doc = builder.newDocument() ;	// 创建一个新的文档
			Element addresslist = doc.createElement("addresslist") ;
			Element linkman = doc.createElement("linkman") ;
			Element name = doc.createElement("name") ;
			Element email = doc.createElement("email") ;
			name.appendChild(doc.createTextNode(MainActivity.this.name.getText()
					.toString()));
			email.appendChild(doc.createTextNode(MainActivity.this.email.getText()
					.toString()));
			linkman.appendChild(name) ;
			linkman.appendChild(email) ;
			addresslist.appendChild(linkman) ;
			doc.appendChild(addresslist) ;
			TransformerFactory tf = TransformerFactory.newInstance() ;
			Transformer t = null ;
			try {
				t = tf.newTransformer() ;
			} catch (TransformerConfigurationException e) {
				e.printStackTrace();
			}
			t.setOutputProperty(OutputKeys.ENCODING, "GBK") ;
			DOMSource source = new DOMSource(doc);
			StreamResult result = new StreamResult(file) ;
			try {
				t.transform(source, result) ;
			} catch (TransformerException e) {
				e.printStackTrace();
			}
		}
		
	}
}

 

实现效果如下:



 


接下来我们来读取刚才我们保存的文件:

定义类似的布局文件:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/TableLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TableRow
        android:id="@+id/TableRow01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名" />

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </TableRow>

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="邮箱" />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
     />

    </TableRow>

    <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/but"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="读取" />

    </TableRow>

</TableLayout>

 Activity代码:

public class MainActivity extends Activity {
	private TextView name = null;
	private TextView email = null;
	private Button but = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_main);
		this.name = (TextView) super.findViewById(R.id.name);
		this.email = (TextView) super.findViewById(R.id.email);
		this.but = (Button) super.findViewById(R.id.but);
		this.but.setOnClickListener(new OnClickListenerImpl());
	}

	private class OnClickListenerImpl implements OnClickListener {

		@Override
		public void onClick(View v) {
			if (!Environment.getExternalStorageState().equals(
					Environment.MEDIA_MOUNTED)) { // 不存在不操作
				return; // 返回到程序的被调用处
			}
			File file = new File(Environment.getExternalStorageDirectory()
					+ File.separator + "eedata" + File.separator
					+ "ee.xml"); // 要输出文件的路径
			if (!file.exists()) { // 文件不存在
				return;
			}
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = null;
			try {
				builder = factory.newDocumentBuilder();
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}
			//定义document类对象接口,通过DocumentBuilder进行DOM树转化
			Document doc = null;
			try {
				doc = builder.parse(file); // 通过文件转化文档,读取指定路径的xml文件
			} catch (SAXException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			//查找节点
			NodeList nl = doc.getElementsByTagName("linkman");
			for (int x = 0; x < nl.getLength(); x++) {
				Element e = (Element) nl.item(x); // 取得元素
				MainActivity.this.name.setText(e.getElementsByTagName("name")
						.item(0).getFirstChild().getNodeValue());
				MainActivity.this.email.setText(e.getElementsByTagName("email")
						.item(0).getFirstChild().getNodeValue());
			}
		}

	}
}

 这一章涉及到很多知识,大家需要好好消化

实现效果如图:




 
 


 
 

 

  • 大小: 3.5 KB
  • 大小: 22.7 KB
  • 大小: 44.9 KB
  • 大小: 27.6 KB
  • 大小: 55 KB
  • 大小: 34.2 KB
  • 大小: 37.8 KB
0
0
分享到:
评论

相关推荐

    android Pull XML文件解析 存取 代码程序

    本篇文章将深入探讨如何在Android中使用Pull解析器进行XML文件的解析和存取。 一、XML解析器简介 在Android中,有两种主要的XML解析方式:SAX(Simple API for XML)和DOM(Document Object Model)。SAX是事件驱动...

    Android 文件存取

    在Android系统中,文件存取是一项基础且重要的功能,它涉及到应用程序如何保存和读取数据。本篇将详细探讨Android的内部存储、外部存储(包括SD卡存储)以及简单的文件管理,尤其是通过对话框实现的文件操作。 首先...

    Android 文件存取示例 基础文件操作

    ### Android 文件存取示例:基础文件操作 #### 概述 本文档旨在提供一个关于Android平台上基础文件操作的示例教程。对于那些希望了解如何在Android应用中进行简单文件读写操作的开发者来说,本教程将是非常有用的...

    Android文件存取和数据库编程UI编程

    在Android应用开发中,文件存取、数据库编程和UI编程是至关重要的组成部分。这份资料集包含两个PDF文档,分别详细讲解了这些主题。下面将分别介绍这三个关键领域的主要知识点。 一、Android文件存取 在Android系统...

    Java解析XML文件的DOM和SAX方式.doc

    Java 解析 XML 文件的 DOM 和 SAX 方式 Java 解析 XML 文件的 DOM 和 SAX 方式是指在 Java 中使用 Document Object Model(DOM)和 Simple API for XML(SAX)两种方式来解析 XML 文件的技术。下面将详细介绍这两种...

    新版Android开发教程+笔记12--文件存取、数据库编程

    ### 新版Android开发教程+笔记12--文件存取、数据库编程 #### 文件存取编程基础 在Android应用开发过程中,文件存取是一项基本而重要的功能。它允许开发者存储和检索用户数据,如配置文件、图像文件等。下面将详细...

    Android基础——XML数据的三种解析方式

    总结来说,Android中解析XML时,DOM适用于小型且需要频繁访问的文件,SAX和Pull解析适合大型文件或资源有限的环境。选择哪种解析方式取决于具体应用场景和性能需求。理解并熟练掌握这三种解析方式,将有助于提升...

    Android文件存取与数据库编程知识 pdf

    在Android开发中,文件存取和数据库编程是两个至关重要的概念。它们构成了应用程序处理数据的基础,使得应用能够存储、读取、更新和删除用户数据。本文将深入探讨这两个主题,帮助开发者更好地理解和掌握Android平台...

    Android教程+笔记十二--文件存取、数据库编程.zip

    在Android应用开发中,文件存取和数据库编程是两个至关重要的环节。本教程将深入探讨这两个主题,帮助开发者更好地理解如何在Android系统中管理和存储数据。 ### 文件存取 #### 1. 存储类型 Android提供了多种...

    Android文件存取与数据库编程知识

    Android文件存取与数据库编程知识,文件操作主要是读文件、写文件、读取静态文件等,同时还介绍了创建添加文件内容并保存,打开文件并显示内容;数据库编程方面主要介绍了SQLite数据库的使用、包括创建、删除、打开...

    Android使用SQLiteDatabase直接存取数据与图像

    在这个主题中,我们将深入探讨如何在Android环境下使用SQLiteDatabase来直接存取数据和图像。 首先,要使用SQLite数据库,我们需要创建一个SQLiteOpenHelper的子类。这个类有两个关键方法:`onCreate()` 和 `...

    asp网页制作利用文件存取组件课件

    3. **文本文件的创建与存取**: - **创建文本文件**: - 首先,创建`FileSystemObject`实例,然后调用`CreateTextFile`方法,传入文件名(可以带路径),可选参数`overwrite`决定是否覆盖已存在的文件,`unicode`...

    android数据存取xml和数据库

    1. DOM解析:DOM(文档对象模型)解析器将整个XML文件加载到内存中,形成一个树形结构。这种解析方式适用于小规模的XML文件,因为其消耗的内存较大。例如,`DocumentBuilderFactory` 和 `DocumentBuilder` 可用于...

    数据的增删改查(随机文件存取)

    3. **更新(Update)**:修改文件中已存在的数据。如果需要更新某条记录,我们需要找到这条记录在文件中的位置,然后覆盖原有数据。为了确保数据的一致性,通常需要先将整个文件读入内存,修改后写回,或者使用临时...

    易语言 xml解析 易语言 xml解析 教程 带源码

    3. **DOM解析**:使用DOM解析,我们可以获取XML文档的节点信息,包括根节点、子节点、属性等,并能对它们进行操作。例如,通过`创建XML文档对象`、`加载XML文件`、`查找指定元素`、`获取属性值`等命令,可以实现对...

    Linux系统文件存取管理

    ### Linux系统文件存取管理 #### 一、Linux系统简介 Linux是一种自由开源的操作系统,其内核由Linus Torvalds于1991年创建。作为一个多用户多任务的分时操作系统,Linux能够支持多个用户同时进行操作,并且能够...

    android txt文件保存读取操作

    在Android平台上,对TXT文件进行保存和读取是常见的数据持久化操作...通过合理地运用这些知识,开发者可以有效地在Android应用中实现TXT文件的存取功能。在实际开发中,还要结合具体的业务需求,进行相应的优化和调整。

    新版Android开发教程 笔记12--文件存取、数据库编程

    在Android应用开发中,文件存取和数据库编程是两个至关重要的概念。对于任何需要持久存储数据的应用来说,理解和掌握这两个方面都是必要的。本教程将深入探讨Android系统中的文件存储机制以及SQLite数据库的使用。 ...

Global site tag (gtag.js) - Google Analytics