Android——PULL解析XML

简介

Android中常常使用XML文件保存用户的APP设置信息。因此需要对XML文件的相关操作进行了解。本文将以《学生信息管理系统》为案例背景进行介绍相关的XML解析的介绍,以及其他相关知识的阐述。

需求:

  1. 在一个Activity中可以动态添加一个学生信息并保存到XML文件。
  2. 同时,还可以查看当前的所有学生信息。

相关技术:

  1. 线性布局
  2. 设置onClick()事件响应函数
  3. 添加一个TextView以显示添加的学生信息
  4. 清空所有的子元素(列表中所有的学生信息的TextView)
  5. PULL创建XML文件
  6. PULL解析XML文件

 

界面UI:

技术分享

 

实现:

  • 界面布局:

界面的布局,首先需要考虑的是:上图中间显示学生信息的栏位,如果学生信息条数过多,需要考虑是否会出现重合。

解决方法:

整个layout采用LinearLayout。

为各个模块设置权重(weight),其中,除显示学生信息的所有部分均不设置权重(即默认为0)并且学生信息显示部分weight=”1。这样既可达到将剩余的部分全部分配给这个部分,

代码:

  1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2     android:layout_width="match_parent" 
  3     android:layout_height="match_parent" 
  4     android:orientation="vertical" > 
  5     
  6     <!-- 第一大板块 --> 
  7     <TextView 
  8         android:layout_width="wrap_content" 
  9         android:layout_height="wrap_content" 
 10         android:text="学生信息管理系统" 
 11         android:layout_gravity="center_horizontal" 
 12         android:textSize="25sp" 
 13         android:textColor="#0000FF" 
 14         />
 15 
 16     <!-- 第二大板块 --> 
 17     <LinearLayout 
 18         android:layout_width="match_parent" 
 19         android:layout_height="wrap_content" 
 20         android:orientation="horizontal" 
 21         > 
 22         <!-- 姓名的输入框 --> 
 23         <LinearLayout 
 24             android:layout_weight="1" 
 25             android:layout_width="0dp" 
 26             android:layout_height="wrap_content" 
 27             android:orientation="vertical" 
 28             > 
 29             <TextView 
 30                 android:layout_gravity="center_horizontal" 
 31                 android:layout_width="wrap_content" 
 32                 android:layout_height="wrap_content" 
 33                 android:text="姓名" 
 34                 /> 
 35             <EditText 
 36                 android:id="@+id/et_studentname" 
 37                 android:layout_width="match_parent" 
 38                 android:layout_height="wrap_content" 
 39                 /> 
 40         </LinearLayout> 
 41         
 42         <!-- 性别的输入框 --> 
 43         <LinearLayout 
 44             android:layout_weight="1" 
 45             android:layout_width="0dp" 
 46             android:layout_height="wrap_content" 
 47             android:orientation="vertical" 
 48             > 
 49             <TextView 
 50                  android:layout_gravity="center_horizontal" 
 51                 android:layout_width="wrap_content" 
 52                 android:layout_height="wrap_content" 
 53                 android:text="性别" 
 54                 /> 
 55             <EditText 
 56                 android:id="@+id/et_studentgender" 
 57                 android:layout_width="match_parent" 
 58                 android:layout_height="wrap_content" 
 59                 /> 
 60         </LinearLayout> 
 61         
 62         <!-- 年龄的输入框 --> 
 63         <LinearLayout 
 64             android:layout_weight="1" 
 65             android:layout_width="0dp" 
 66             android:layout_height="wrap_content" 
 67             android:orientation="vertical" 
 68             > 
 69             <TextView 
 70                  android:layout_gravity="center_horizontal" 
 71                 android:layout_width="wrap_content" 
 72                 android:layout_height="wrap_content" 
 73                 android:text="年龄" 
 74                 /> 
 75             <EditText 
 76                 android:id="@+id/et_studentage" 
 77                 android:layout_width="match_parent" 
 78                 android:layout_height="wrap_content" 
 79                 /> 
 80         </LinearLayout> 
 81         
 82         <!-- 权重不写的话,默认就是0 --> 
 83         <Button 
 84             android:id="@+id/bt_addstudent" 
 85             android:layout_width="wrap_content" 
 86             android:layout_height="wrap_content" 
 87             android:text="添加学生" 
 88             android:layout_gravity="bottom" 
 89             android:onClick="addStudent" 
 90             /> 
 91     </LinearLayout> 
 92     <!-- 第三大板块 --> 
 93     <ScrollView 
 94         android:layout_weight="1" 
 95         android:layout_width="match_parent" 
 96         android:layout_height="0dp" 
 97         > 
 98         <LinearLayout 
 99             android:id="@+id/part3" 
100             android:layout_width="match_parent" 
101             android:layout_height="match_parent" 
102             android:orientation="vertical" 
103             > 
104             <!-- 用户每点击一次添加按钮,就在代码中new一个textView显示学生信息 --> 
105         </LinearLayout> 
106     </ScrollView> 
107     <!-- 第四大板块 --> 
108     <LinearLayout 
109         android:layout_width="match_parent" 
110         android:layout_height="wrap_content" 
111         android:orientation="horizontal" 
112         > 
113         <Button 
114             android:id="@+id/bt_savetoxml" 
115             android:layout_weight="1" 
116             android:layout_width="0dp" 
117             android:layout_height="wrap_content" 
118             android:text="保存信息" 
119             android:onClick="savetoxml" 
120             /> 
121         <Button 
122             android:id="@+id/bt_getfromxml" 
123             android:layout_weight="1" 
124             android:layout_width="0dp" 
125             android:layout_height="wrap_content" 
126             android:text="查看信息" 
127             android:onClick="getfromxml" 
128             /> 
129     </LinearLayout>
130 
131 </LinearLayout> 

 

    

 

  • onClick事件

在设置响应事件之前,首先需要考虑以下内容:

当点击“添加学生”按钮时,应该在下面的显示需要添加的学生信息;

当点击“保存信息”按钮时,需要将上面需要添加学生信息保存到XML文件中。然而,如何获取该页面中的学生信息呢?同时,在查看学生信息时,如果从XML文件中读取出学生信息,添加textview到这里,会不会重复呢?

解决方案:

1-在Activity的onCreate方法中初始化一个List<Student>,用于保存学生信息。
studentList=new ArrayList<Student>();

 

2-当添加学生信息时,将初始化一个学生对象,并添加到该List中。
 1 public void addStudent(View v){ 
 2         String name = studentname.getText().toString(); 
 3         String gender = studentgender.getText().toString(); 
 4         String age = studentage.getText().toString();
 5 
 6         TextView studentinfo = new TextView(this); 
 7         studentinfo.setText(name+"    "+gender+"    "+age); 
 8         LinearLayout linearLayout = (LinearLayout) findViewById(R.id.part3); 
 9         linearLayout.addView(studentinfo); 
10         Student student=new Student(name, gender, age); 
11         studentList.add(student); 
12     }

 

        上面的代码中,TextView studentinfo = new TextView(this);用于在显示学生信息栏创建一个TextView。并使用linearLayout.addView(studentinfo)将创建的TextView添加到显示栏。将该学生添加到List中——studentList.add(student)

3-在保存信息时,遍历整个List,将学生信息保存到XML文件。
public void savetoxml(View v){ 
        XmlSerializer xs = Xml.newSerializer(); 
        FileOutputStream fos=null; 
            fos=new FileOutputStream(new File(getFilesDir(), "students.xml")); 
            xs.setOutput(fos, "utf-8"); 
            xs.startDocument("utf-8", true); 
            xs.startTag(null, "students"); 
                for(Student student: studentList){ 
                     xs.startTag(null, "student"); 
                    xs.startTag(null, "name"); 
                        xs.text(student.getName()); 
                    xs.endTag(null, "name"); 
                    //--------------------------------- 
                    xs.startTag(null, "gender"); 
                        xs.text(student.getGender()); 
                    xs.endTag(null, "gender"); 
                    //--------------------------------- 
                    xs.startTag(null, "age"); 
                        xs.text(student.getAge()); 
                    xs.endTag(null, "age"); 
                xs.endTag(null, "student"); 
              } 
            xs.endTag(null, "students"); 
            xs.endDocument(); 
           }

 

4-在查看学生信息时,首先清空之前页面中的学生信息,将Listclear,并显示已保存的学生信息保存到List中,同时将学生信息添加到显示栏
public void getfromxml(View v){ 
        //1-如果当前页面中有学生信息列出,首先删除列表信息 
        studentList.clear(); 
        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.part3); 
        linearLayout.removeAllViews(); 
        //2-从XML文件中读取学生信息,新建textview,并将学生信息添加到其中 
        parse(); 
    }

 

public void parse(){ 
        XmlPullParser parser= Xml.newPullParser(); 
        Student student=null; 
        TextView studentinfo =null; 
        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.part3); 
        InputStream in=new FileInputStream(new File(getFilesDir(), "students.xml")); 
            parser.setInput(in, "UTF-8"); 
            int evenType=parser.getEventType(); 
            while(evenType!=XmlPullParser.END_DOCUMENT){ 
                if(evenType==XmlPullParser.START_TAG){ 
                    if("student".equals(parser.getName())){ 
                        student=new Student(); 
                        studentinfo = new TextView(this); 
                    } 
                    if("name".equals(parser.getName())){ 
                        student.setName(parser.nextText()); 
                    } 
                    if("gender".equals(parser.getName())){ 
                        student.setGender(parser.nextText()); 
                    } 
                    if("age".equals(parser.getName())){ 
                        student.setAge(parser.nextText()); 
                    } 
                } 
                if(evenType==XmlPullParser.END_TAG&& "student".equals(parser.getName())) 
                { 
                    Log.i("student", student.toString()); 
                    studentList.add(student); 
                    linearLayout.addView(studentinfo); 
                    studentinfo.setText(student.getName()+"\t"+student.getGender()+"\t"+student.getAge()); 
                    student=null; 
                } 
                evenType=parser.next(); 
            } 
           }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。