Android XML解析与保存程序代码

 更新时间:2016年9月20日 20:00  点击:1442
在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。

解析XML文件:

在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。

SAX解析器:

SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。

SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。

DOM解析器:

DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。

由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。

PULL解析器:

在Android平台上可以使用SAX、DOM和Android附带的pull解析器解析XML文件;
pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理;通过paser.nextText()方法可以获取下一个Text类型的节点的值;


读取XML

 代码如下 复制代码
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(xml, "UTF-8");//为破解器添加要解析的XML数据
int event = pullParser.getEventType();//开始读取,获取事件返回值
pullParser.getName();//获取节点名称
pullParser.getAttributeValue(0);//获取第一个属性的值
pullParser.nextText();//获取标签之后的节点的内容
event = pullParser.next();

//解析器遇到结束标签不会自动向下解析,需要调用此方法进行继续执行;

保存文件到XML

 代码如下 复制代码

public static void save(List<Person> persons, OutputStream outStream)
throws Exception, IllegalStateException, IOException {
XmlSerializer serializer = Xml.newSerializer();//获取XML写入信息的序列化对象
serializer.setOutput(outStream, "UTF-8");//设置要写入的OutputStream
serializer.startDocument("UTF-8", true);//设置文档标签

serializer.startTag(null, "persons");//设置开始标签,第一个参数为namespace
for (Person person : persons) {
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId().toString());

serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");

serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");

serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
outStream.flush();
outStream.close();
}

解析xml

 代码如下 复制代码

<?xml version="1.0" encoding="utf-8"?>
<books>
 <book>
  <id>1001</id>
  <name>Thinking In Java</name>
  <price>80.00</price>
 </book>
 <book>
  <id>1002</id>
  <name>Core Java</name>
  <price>90.00</price>
 </book>
 <book>
  <id>1003</id>
  <name>Hello, Andriod</name>
  <price>100.00</price>
 </book>
</books>

然后我们分别使用以上三种解析技术解析文档,得到一个List<Book>的对象,先来看一下Book.java的代码:

 代码如下 复制代码

package com.scott.xml.model;

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 setName(String name) {
  this.name = name;
 }

 public float getPrice() {
  return price;
 }

 public void setPrice(float price) {
  this.price = price;
 }

 @Override
 public String toString() {
  return "id:" + id + ", name:" + name + ", price:" + price;
 }
}

最后,我们还要把这个集合对象中的数据生成一个新的XML文档,生成的XML结构跟原始文档略有不同,是下面这种格式:

 代码如下 复制代码

<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book id="1001">
    <name>Thinking In Java</name>
    <price>80.0</price>
  </book>
  <book id="1002">
    <name>Core Java</name>
    <price>90.0</price>
  </book>
  <book id="1003">
    <name>Hello, Andriod</name>
    <price>100.0</price>
  </book>
</books>

接下来,就该介绍操作过程了,我们先为解析器定义一个BookParser接口,每种类型的解析器需要实现此接口。BookParser.java代码如下:

 代码如下 复制代码

package com.scott.xml.parser;

import java.io.InputStream;
import java.util.List;

import com.scott.xml.model.Book;

public interface BookParser {
 /**
  * 解析输入流 得到Book对象集合
  * @param is
  * @return
  * @throws Exception
  */
 public List<Book> parse(InputStream is) throws Exception;
 
 /**
  * 序列化Book对象集合 得到XML形式的字符串
  * @param books
  * @return
  * @throws Exception
  */
 public String serialize(List<Book> books) throws Exception;
}

本文章来给各位朋友介绍Android电话播号与短信发送实现测试代码,有需要了解学习的朋友可参考参考。

Android应用程序架构

src/ java原代码存放目录
gen/ 自动生成目录
gen 目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的xml界面文件、图标与常量,同步更新修改 R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了界面、图标、常量等各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。
res/ 资源(Resource)目录
存放应用使用到的各种资源,如xml界面文件,图片或数据。
AndroidManifest.xml 功能清单文件
列出了应用程序所提供的功能,在这个文件中,你可以指定应用程序使用到的服务(如电话服务、互联网服务、短信服务、GPS服务等等)。
当新添加一个Activity的时候,也需要在这个文件中进行相应配置,只有配置好后,才能调用此Activity。
default.properties 项目环境信息,一般是不需要修改此文件


Intent:当找到与设置的Intent限制相同的Activity时候通过startActivity()就会启动该Activity

电话播号器:

)AndroidManifest.xml中添加电话服务权限:

 代码如下 复制代码
<uses-permission android:name="android.permission.CALL_PHONE"/>

2)界面布局

 代码如下 复制代码
LinearLayout (线性布局)、AbsoluteLayout(绝对布局)、RelativeLayout(相对布局)、TableLayout(表格布局)、FrameLayout(帧布局)

3)Activity:
为按钮增加单击事件,在这个事件中添加处理事件的代码
在Android开发中,为了效率的考虑我们使用内部类会很多,这里就是经常会出现的一个地方.
为按钮添加单击事件,并在事件中处理程序.

 代码如下 复制代码


intent.setAction("android.intent.action.CALL");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("tel:" + strmobile));
startActivity(intent);//方法内部会自动为Intent添加类别:android.intent.category.DEFAULT


button.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v) {
            EditText editText = (EditText)findViewById(R.id.mobile);
            Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ editText.getText()));
            DialerAction.this.startActivity(intent);
    }


短信发送器:

 代码如下 复制代码

SmsManager manager = SmsManager.getDefault();
ArrayList<String> texts = manager.divideMessage(comtent);
for (String text : texts) {
manager.sendTextMessage(number, null, text, null, null);// 4和5参数分别为短信发送状态,对方是否收到短信状态;
}
Toast.makeText(getApplicationContext(),R.string.success,Toast.LENGTH_LONG).show();
吐西对话框// Toast.makeText(MainActivity.this, resId, duration);//内部类访问外部类;

****************************************************************

findViewById(R.id.button);// 根据id查找显示控件;
View.OnClickListener() {
@Override
public void onClick(View arg0) {
//arg0 就是被点击的对象
}
}

@+id/button:在R文件的id内部类里面,添加一个id为button的常量,使用该常量的值作为此控件的id值;
@android:表示访问android包下的R文件;
@id/label:表示访问id为label的文件;(相对布局)

单元测试:

继承类:AndroidTestCase

 代码如下 复制代码

<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.hellokity" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="android.test.runner" />
</application>

actual = function();
Assert.assertEquals(3,actual);判断actual是否为3;

结:
--使用系统服务的时候不要忘记在AndroidManifest.xml中添加服务权限
--短信服务在这里,使用了SmsManager类,来操作.
--发送短信时要判断是否大于70个字
--Toast使用的时候,不要忘记show().要不然不会显示.

SQLite 事务处理和我们在mysql中事物处理原理差不多可以大批量处理数据并且可以回滚,下面小编给大家来介绍Android SQLite 事务处理用法,有需要了解的机友可参考。

.使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。

 

 代码如下 复制代码
public void payment() {
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
db.beginTransaction();//开始事务
try {
db.execSQL("update person set amount=amount-10 where personid=2");
db.execSQL("update person set amount=amount+10 where personid=5");
db.setTransactionSuccessful();// 设置事务的标志为true,调用此方法会在执行到endTransaction()方法是提交事务,若没有调用此方法会在执行到endTransaction()方法回滚事务。
} catch (SQLException e) {
} finally {
db.endTransaction();
}
// 结束事务,有两种情况:commit,rollback,
// 事务的提交或回滚是由事务的标志决定的,如果事务的标志为true就会提交,否则回滚,默认情况下事务的标志为false
}

应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
而且不能保证所有数据都能同时插入

加事务处理,把5000条插入作为一个事务


我们使用SQLite的事务进行控制:

 代码如下 复制代码
        db.beginTransaction();  //手动设置开始事务
        try{
            //批量处理操作
            for(Collection c:colls){
                insert(db, c);
            }
            db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交
           }catch(Exception e){
               MyLog.printStackTraceString(e);
           }finally{
               db.endTransaction(); //处理完成
           }
现在安卓手机开发的人群越来越多了,下面我来介绍很基础的android文件操作之文件读写操作,有需要学习了解的朋友可参考本文章。
 代码如下 复制代码

数据存储与访问常用方式:
文件
SharedPreferences(偏好参数设置)
SQLite数据库
内容提供者(Content provider)
网络

Activity(Context)
Context.getCacheDir()方法用于获取/data/data/<package name>/cache目录
Context.getFilesDir()方法用于获取/data/data/<package name>/files目录

Activity(Context)提供了openFileOutput(filename,mode)方法用于把数据输出到文件中;
第一个参数用于指定文件名称,不能包含路径分隔符‘/'
第二个参数为操作模式:
Context.MODE_PRIVATE:私有操作模式创建出来的文件只能被本程序访问,如果文件不存在,会自动创建,另外:写入文件中的内容会覆盖原文件的内容;
Context.MODE_APPEND:模式会检查文件是否存在,如果存在则会追加内容,否则创建新文件;
Context.MODE_READABLE:表示当前文件可以被其它应用读取;
Context.MODE_WRITEABLE:表示当前文件可以被其它应用写入;

如果希望文件被其它应用读和写:传入(Context.MODE_READABLE+Context.MODE_WRITEABLE)
FileOutputStream outStream = context.openFileOutput(filename,Context.MODE_PRIVATE);

例子

//写数据
public void writeFile(String fileName,String writestr{
  try{

        FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);

        byte [] bytes = writestr.getBytes();

        fout.write(bytes);

        fout.close();
      }

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

//读数据
public String readFile(String fileName){
  String res="";
  try{
         FileInputStream fin = openFileInput(fileName);
         int length = fin.available();
         byte [] buffer = new byte[length];
         fin.read(buffer);    
         res = EncodingUtils.getString(buffer, "UTF-8");
         fin.close();    
     }
     catch(Exception e){
         e.printStackTrace();
     }
     return res;

}  

//param 文件名称,操作方式

android有一套自己的安全模型,当应用程序(.apk)在安装时系统会分配给一个userid,当该应用去访问其它资源如文件的时候,会进行 userid的匹配,默认情况下任何应用创建的文件,sharedpreferences,数据库都是私有的(创建的文件保存在/data/data /<package name>/files目录下),只有指定操作模式为外部可读或写才可以被其它程序访问;

读取文件:

<1>
FileInputStream inStream = context.openFileInput(filename);
Log.i(TAG,inStream....)

<2>
path="/data/data/<package name>/files/hello.txt";
File file = new File(path);
FileInputStream inStream = new FileInputStream(file);
Log.i(TAG,inStream....)

ctrl + shift + x/y 大小写

从resource的raw中读取文件数据:

String res = "";
try{
 
    //得到资源中的Raw数据流
    InputStream in = getResources().openRawResource(R.raw.test);

    //得到数据的大小
    int length = in.available();      

    byte [] buffer = new byte[length];       

    //读取数据
    in.read(buffer);        

    //依test.txt的编码类型选择合适的编码,如果不调整会乱码
    res = EncodingUtils.getString(buffer, "BIG5");
   
    //关闭   
    in.close();           

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

现在我来给大家总结一个实例

 代码如下 复制代码

/**
 * 【文件操作】
 */
package Iwit.IwitTest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import android.content.Context;
import android.widget.Toast;

/**
 * @author Shine
 *【文件读,写】
 */
public class FileOperate

 /**
  * 【读取文件】
  * @param context
  * @param fileName
  * @return
  */
 public String ReadText(Context context,String fileName)
 {
       FileInputStream fIn = null;
       InputStreamReader isr = null;      
       char[] inputBuffer = new char[255];
       String data = null;      
       try
       {
        fIn =context.openFileInput(fileName);     
           isr = new InputStreamReader(fIn);
           isr.read(inputBuffer);
           data = new String(inputBuffer);
           Toast.makeText(context, "read Succeed",Toast.LENGTH_SHORT).show();
       }
      catch (Exception e)
          {     
       e.printStackTrace();
       Toast.makeText(context, " not read",Toast.LENGTH_SHORT).show();
          }
       finally
       {
              try {
                     isr.close();
                     fIn.close();
                   }
              catch (IOException e)
              {
                    e.printStackTrace();
              }
           }
       return data;
   }
 
 /**
  * 【写入文件】
  * @param context
  * @param fileName
  * @param data
  */
 public void WriteText(Context context, String fileName,String data)
 {
       FileOutputStream fOut = null;
       OutputStreamWriter osw = null;
      
       try{
        fOut =context.openFileOutput(fileName, 1);
           osw = new OutputStreamWriter(fOut);
           osw.write(data);
           osw.flush();
           Toast.makeText(context, " saved",Toast.LENGTH_SHORT).show();
           }
           catch (Exception e)
           {     
           e.printStackTrace();
           Toast.makeText(context, " not saved",Toast.LENGTH_SHORT).show();
           }
           finally
           {
              try {
                     osw.close();
                     fOut.close();
                   }
              catch (IOException e)
               {
                    e.printStackTrace();
                 }
           }
  }
}

上面就可以实现对文件的读写操作了

无线网络通常我们讲到的是wifi网络,也就是大家笔记本电脑上的网,下面我来介绍小米2手机怎么连接无线网络吧,有需要的朋友可参考。

1、在你小米手机中点击“系统”-“WLAN”如下图所示。

小米2手机怎么连接无线网络

2、然后我们再点击“WLAN”和“自动搜索”功能

小米2手机怎么连接无线网络

3、点击自动搜索之后小米手机就会自动搜索附近可以连接wifi网络了解。

小米2手机怎么连接无线网络

4、找到可连接的网络之后我们再点击wifi然后再输入密码即可连接了。

小米2手机怎么连接无线网络

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • php常量详细解析

    一、常量常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。按照惯例常量标识符总是大写的。 常量名和其它任何 PHP 标签遵循...2015-10-30
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20