Android读取XML实现软件自动登陆

版权声明:转载请注明本文链接 https://blog.csdn.net/qq_31844349/article/details/80383900

    嘿嘿,大家好又见面了,这次我们不在学习那些干货,来点有趣的,大家都知道在我们日常生活中有很多可以自动登陆的软件,例如:某宝,某东,这些软件都实现了自动登陆,这次呢,咱们也不能落后是吧,咱们也来实现个自动登陆的小程序,不过咱们这个自动登陆的小程序可不想淘宝 京东那么的高大上,因为我们实现的都是一些简单的小程序,他们实现自动登陆的例子,咱们后面再聊,嘿嘿(脑补下,是贱贱的微笑)。好了废话不多少,教程开始。

    我在这里准备了一个XML文件,你们测试的时候呢在sd卡中创建一个名字为logi2.xml的文件,把下面的代码复制进去就可以了:就这一点不是很多

<?xml version="1.0" encoding="utf-8"?>
<persons>
  <person id="1">
    <name>张三</name>
    <age>20</age>
  </person>
</persons>

大家想想我们应该如何实现这个功能呢,我们首先是需要把xml里面的数据读取出来,然后在进行解析,得到我们想要的账号密码还有特征符(我自己编的名字就是判断当前是否设置自动登陆,牛逼吧。


我们先来打开保存账号密码的xml文件,我的文件放在了sd卡的根目录。


打开文件:

File file = new File(Environment.getExternalStorageDirectory(), "login2.xml");
fileInputStream = new FileInputStream(file);

打开文件我们会得到一个输入流,这个输入流我们设置成全局的变量

我们再来创建一个SAX的class文件,用于解析xml文件:

在这个文件里创建一个getSAX的方法,参数是输入流(fileInputStream),返回类型是List<LoginBean>,这里先不要着急,我们的LoginBean会在后面创建。

//创建一个SAX解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//得到一个SAX解析器
SAXParser parser = factory.newSAXParser();
//解析方法  这个由自己创建的一个类
SAXHandler handler = new SAXHandler();
//执行  这里的inputstream就是参数传递进来的
parser.parse(inputStream,handler);
//拿到返回值
return handler.getLoginBeans();

这里就是SAX解析XML的代码,但是这些还是不够的,我们还需要一个SAXHandler来处理,我先把SAX类的代码拿出来让大家看看吧:

package com.sang.carr.readxml;

import org.xml.sax.SAXException;

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

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SAX {
    public static List<LoginBean> getSAX(InputStream inputStream) {
        try {
            //创建一个SAX解析工厂
            SAXParserFactory factory = SAXParserFactory.newInstance();
            //得到一个SAX解析器
            SAXParser parser = factory.newSAXParser();
            //解析方法  这个由自己创建的一个类
            SAXHandler handler = new SAXHandler();
            //执行
            parser.parse(inputStream,handler);
            //拿到返回值
            return handler.getLoginBeans();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new ArrayList<>();
    }
}

我们在创建一个SAXHanlder的类,他继承DefaultHandler类

还需要实现它的四个方法,分别是:

startDocument 开始读取文档
endDocument 结束读取文档
startElement 开始读取元素
endElement 结束读取元素
characters 读取字符

先看看这四方法实现的什么功能吧:

开始读取文档:

@Override
    public void startDocument() throws SAXException {
        super.startDocument();
        loginBeans = new ArrayList<LoginBean>();
    }

这个里面因为我们使用一个List集合用来存储LoginBean,所以在开始读取文档的时候我们需要创建一个List集合

结束读取文档:

 @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

这里什么也没有做

开始读取元素:

 @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        tag = localName;
        if (tag.equals("person")) {
            loginBean = new LoginBean();
            loginBean.setId(attributes.getValue("id"));
        }
    }

在这里们创建一个全局变量的String类型,用来存储localName,因为我们在别的方法里还需要用到

判断tag的内容是否是person,如果是的话创建一个LoginBean的全局变量,并且设置LoginBean的id值,这里的attributes.getValue("id") 是通过id来获取到xml的person的属性,这个属性的名字是id。

结束读取元素:

 @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if (localName.equals("person")) {
            loginBeans.add(loginBean);
        }
    }

这里没有什么可说的,当结束读取元素的时候把loginbean加入到loginbeans中就可以了。

读取字符:

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        String data = new String(ch, start, length);
        if (data != null && tag != null) {
            if(tag.equals("name")){
                loginBean.setName(data);
            }else if(tag.equals("age")){
                loginBean.setAge(data);
            }
        }
    }

这是这三个参数的解释:


然后我们根据节点的名称来设置相应的属性。

上面主要的模块介绍完了,我们来看下全部的代码

下面是整个项目的全部代码


MainActivity.java

package com.sang.carr.readxml;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStream;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private Button read;
    private FileInputStream fileInputStream;
    private String[] list_fenge;
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        geData();
        zidong();

//        read.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//
//            }
//        });
    }

    //自动登陆方法
    private void zidong(){
        List<LoginBean> list = SAX.getSAX(fileInputStream);
        Log.d("TT", list.toString());    
        list_fenge = list.toString().split(","); //分割文本 我们解析完XMl后的toString方法的返回格式是[,1,张三,20]使用,
        //作为分隔符分割成字符串数组,关于返回格式请看LoginBean.java
        Log.d("SS", list_fenge[1]);
        Log.d("GG", list_fenge[2]);
        Log.d("CC", list_fenge[3]);
        login();
    }

    //判断是否设置自动登陆  1为自动登陆
    private void login() {
        if (list_fenge[1].equals("1")) {
            if (list_fenge[2].equals("张三") && list_fenge[3].equals("20")) {
                tv.setText("登陆成功");
            }else{
                tv.setText("登陆失败");
            }
        }
    }

    //初始化控件
    private void init() {
        read = findViewById(R.id.readSd);
        tv = findViewById(R.id.tv);
    }

    //获取到数据
    private void geData() {
            File file = new File(Environment.getExternalStorageDirectory(), "login2.xml");
        try {
            fileInputStream = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
//            BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
//            String Line = "";
//            StringBuffer sb = new StringBuffer();
//            while ((Line = bufferedReader.readLine()) != null) {
//                sb.append(Line);
//            }
//            bufferedReader.close();
//            Log.d("TT", sb.toString());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }
}


SAX.java

package com.sang.carr.readxml;

import org.xml.sax.SAXException;

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

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SAX {
    public static List<LoginBean> getSAX(InputStream inputStream) {
        try {
            //创建一个SAX解析工厂
            SAXParserFactory factory = SAXParserFactory.newInstance();
            //得到一个SAX解析器
            SAXParser parser = factory.newSAXParser();
            //解析方法  这个由自己创建的一个类
            SAXHandler handler = new SAXHandler();
            //执行
            parser.parse(inputStream,handler);
            //拿到返回值
            return handler.getLoginBeans();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new ArrayList<>();
    }
}

SAXHandler.java

package com.sang.carr.readxml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

public class SAXHandler extends DefaultHandler {

    private List<LoginBean> loginBeans;
    private LoginBean loginBean;
    private String tag;

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        loginBeans = new ArrayList<LoginBean>();
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        tag = localName;
        if (tag.equals("person")) {
            loginBean = new LoginBean();
            loginBean.setId(attributes.getValue("id"));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if (localName.equals("person")) {
            loginBeans.add(loginBean);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        String data = new String(ch, start, length);
        if (data != null && tag != null) {
            if(tag.equals("name")){
                loginBean.setName(data);
            }else if(tag.equals("age")){
                loginBean.setAge(data);
            }
        }
    }

    public List<LoginBean> getLoginBeans() {
        return loginBeans;
    }
}

LoginBean.java

package com.sang.carr.readxml;

public class LoginBean {

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
//        return "LoginBean{" +
//                "name='" + name + '\'' +
//                ", age='" + age + '\'' +
//                '}';
        return "," + id + "," + name + "," + age + ",";
    }
}
软件界面XMl
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/readSd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="读取SD卡文件"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

这个就是完整的程序自动登陆的小程序,

效果图:


猜你喜欢

转载自blog.csdn.net/qq_31844349/article/details/80383900