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