Android讀取XML實現軟體自動登陸

__Zoey_發表於2018-05-20

    嘿嘿,大家好又見面了,這次我們不在學習那些乾貨,來點有趣的,大家都知道在我們日常生活中有很多可以自動登陸的軟體,例如:某寶,某東,這些軟體都實現了自動登陸,這次呢,我們們也不能落後是吧,我們們也來實現個自動登陸的小程式,不過我們們這個自動登陸的小程式可不想淘寶 京東那麼的高大上,因為我們實現的都是一些簡單的小程式,他們實現自動登陸的例子,我們們後面再聊,嘿嘿(腦補下,是賤賤的微笑)。好了廢話不多少,教程開始。

    我在這裡準備了一個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>

這個就是完整的程式自動登陸的小程式,

效果圖:


相關文章