zoukankan      html  css  js  c++  java
  • android 中解析XML的方法(转)

    在XML解析和使用原始XML资源中都涉及过对XML的解析,之前使用的是 DOM4J和 XmlResourceParser 来解析的。本文中将使用XmlPullParser来解析,分别解析不同复杂度的test1.xml、test2.xml、test3.xml。代码如下:

    MainActivity:

    package com.home.xmlparsetest;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Xml;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ExpandableListView;
    
    public class MainActivity extends Activity implements OnClickListener {
      private Button parseBtn1;
      private Button parseBtn2;
      private Button parseBtn3;
      private ExpandableListView listView;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initWidget();
      }
    
      private void initWidget() {
        parseBtn1 = (Button) findViewById(R.id.main_btn_test1);
        parseBtn1.setOnClickListener(this);
        parseBtn2 = (Button) findViewById(R.id.main_btn_test2);
        parseBtn2.setOnClickListener(this);
        parseBtn3 = (Button) findViewById(R.id.main_btn_test3);
        parseBtn3.setOnClickListener(this);
        listView = (ExpandableListView) findViewById(R.id.list);
      }
    
      @Override
      public void onClick(View v) {
        if (v == parseBtn1) {
          InputStream is = getAssetsStream("test1.xml");
          List<ClassBean> list = parseFile1(is);
          listView.setAdapter(new MyAdapter(this, list));
        } else if (v == parseBtn2) {
          InputStream is = getAssetsStream("test2.xml");
          List<ClassBean> list = parseFile2(is);
          listView.setAdapter(new MyAdapter(this, list));
        } else if (v == parseBtn3) {
          InputStream is = getAssetsStream("test3.xml");
          List<ClassBean> list = parseFile3(is);
          listView.setAdapter(new MyAdapter(this, list));
        }
      }
    
      /**
       * 得到Assets里面相应的文件流
       * 
       * @param fileName
       * @return
       */
      private InputStream getAssetsStream(String fileName) {
        InputStream is = null;
        try {
          is = getAssets().open(fileName);
        } catch (IOException e) {
          e.printStackTrace();
        }
        return is;
      }
    
      /**
       * 解析test1.xml
       * 
       * @param is
       * @return list
       */
      private List<ClassBean> parseFile1(InputStream is) {
        List<ClassBean> list = new ArrayList<ClassBean>();
        try {
          XmlPullParser parser = Xml.newPullParser();
          parser.setInput(is, "utf-8");
          int event = parser.getEventType();
          while (event != XmlPullParser.END_DOCUMENT) {
            switch (event) {
            case XmlPullParser.START_DOCUMENT:
              break;
            case XmlPullParser.START_TAG:
              if ("class".equals(parser.getName())) {
                ClassBean bean = new ClassBean();
                bean.setId(parser.getAttributeValue(0));
                bean.setName(parser.nextText());
                list.add(bean);
              }
              break;
            }
            event = parser.next();
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        return list;
      }
    
      /**
       * 解析test2.xml
       * 
       * @param is
       * @return list
       */
      private List<ClassBean> parseFile2(InputStream is) {
        List<ClassBean> list = null;
        ClassBean bean = null;
        List<StudentBean> sList = null;
        StudentBean be = null;
        try {
          XmlPullParser parser = Xml.newPullParser();
          parser.setInput(is, "utf-8");
          int event = parser.getEventType();
          while (event != XmlPullParser.END_DOCUMENT) {
            switch (event) {
            case XmlPullParser.START_DOCUMENT:
              list = new ArrayList<ClassBean>();
              break;
            case XmlPullParser.START_TAG:
              if ("class".equals(parser.getName())) {
                bean = new ClassBean();
                bean.setId(parser.getAttributeValue(0));
                bean.setName(parser.getAttributeValue(1));
                sList = new ArrayList<StudentBean>();
              } else if ("student".equals(parser.getName())) {
                be = new StudentBean();
                be.setId(parser.getAttributeValue(0));
                be.setName(parser.nextText());
                sList.add(be);
              }
              break;
            case XmlPullParser.END_TAG:
              if ("class".equals(parser.getName())) {
                bean.setList(sList);
                list.add(bean);
                bean = null;
              }
              break;
            }
            event = parser.next();
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        return list;
      }
    
      /**
       * 解析test3.xml
       * 
       * @param is
       * @return list
       */
      private List<ClassBean> parseFile3(InputStream is) {
        List<ClassBean> list = null;
        ClassBean bean = null;
        List<StudentBean> sList = null;
        StudentBean be = null;
        try {
          XmlPullParser parser = Xml.newPullParser();
          parser.setInput(is, "utf-8");
          int event = parser.getEventType();
          while (event != XmlPullParser.END_DOCUMENT) {
            switch (event) {
            case XmlPullParser.START_DOCUMENT:
              list = new ArrayList<ClassBean>();
              break;
            case XmlPullParser.START_TAG:
              if ("class".equals(parser.getName())) {
                bean = new ClassBean();
                bean.setId(parser.getAttributeValue(0));
                bean.setName(parser.getAttributeValue(1));
                sList = new ArrayList<StudentBean>();
              } else if ("student".equals(parser.getName())) {
                be = new StudentBean();
                be.setId(parser.getAttributeValue(0));
                sList.add(be);
              } else if ("name".equals(parser.getName())) {
                be.setName(parser.nextText());
              } else if ("sex".equals(parser.getName())) {
                be.setSex(parser.nextText());
              }
              break;
            case XmlPullParser.END_TAG:
              if ("class".equals(parser.getName())) {
                bean.setList(sList);
                list.add(bean);
                bean = null;
              }
              break;
            }
            event = parser.next();
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        return list;
      }
    }

    MyAdapter:

    package com.home.xmlparsetest;
    
    import java.util.List;
    import android.content.Context;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    public class MyAdapter extends BaseExpandableListAdapter {
      private List<ClassBean> classList;
      private Context context;
    
      public MyAdapter(Context context, List<ClassBean> classList) {
        this.context = context;
        this.classList = classList;
      }
    
      @Override
      public Object getChild(int groupPosition, int childPosition) {
        List<StudentBean> sList = classList.get(groupPosition).getList();
        StudentBean be = null;
        if (sList != null) {
          be = sList.get(childPosition);
        }
        return be;
      }
    
      @Override
      public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
      }
    
      @Override
      public View getChildView(int groupPosition, int childPosition,
          boolean isLastChild, View convertView, ViewGroup parent) {
        LinearLayout ll = new LinearLayout(context);
        ll.setOrientation(LinearLayout.HORIZONTAL);
        List<StudentBean> sList = classList.get(groupPosition).getList();
    
        if (sList != null && sList.size() > 0
            && sList.get(childPosition).getId() != null) {
          TextView tv1 = getTextView2();
          tv1.setText(sList.get(childPosition).getId());
          ll.addView(tv1);
        }
    
        if (sList != null && sList.size() > 0
            && sList.get(childPosition).getName() != null) {
          TextView tv2 = getTextView2();
          tv2.setText(sList.get(childPosition).getName());
          ll.addView(tv2);
        }
    
        if (sList != null && sList.size() > 0
            && sList.get(childPosition).getSex() != null) {
          TextView tv3 = getTextView2();
          tv3.setText(sList.get(childPosition).getSex());
          ll.addView(tv3);
        }
        return ll;
      }
    
      @Override
      public int getChildrenCount(int groupPosition) {
        int size = 0;
        List<StudentBean> sList = classList.get(groupPosition).getList();
        if (sList != null) {
          size = sList.size();
        }
        return size;
      }
    
      @Override
      public Object getGroup(int groupPosition) {
        return classList.get(groupPosition);
      }
    
      @Override
      public int getGroupCount() {
        return classList.size();
      }
    
      @Override
      public long getGroupId(int groupPosition) {
        return groupPosition;
      }
    
      @Override
      public View getGroupView(int groupPosition, boolean isExpanded,
          View convertView, ViewGroup parent) {
        LinearLayout ll = new LinearLayout(context);
        ll.setOrientation(LinearLayout.HORIZONTAL);
        TextView tv1 = getTextView1();
        tv1.setText(classList.get(groupPosition).getId());
        ll.addView(tv1);
    
        TextView tv2 = getTextView1();
        tv2.setText(classList.get(groupPosition).getName());
        ll.addView(tv2);
        return ll;
      }
    
      @Override
      public boolean hasStableIds() {
        return true;
      }
    
      @Override
      public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
      }
    
      private TextView getTextView1() {
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
        lp.setMargins(0, 0, 20, 0);
        TextView tv = new TextView(context);
        tv.setLayoutParams(lp);
        tv.setGravity(Gravity.CENTER_VERTICAL);
        tv.setPadding(36, 0, 0, 0);
        tv.setTextSize(25);
        return tv;
      }
    
      private TextView getTextView2() {
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
        lp.setMargins(20, 0, 50, 0);
        TextView tv = new TextView(context);
        tv.setLayoutParams(lp);
        tv.setGravity(Gravity.CENTER_VERTICAL);
        tv.setPadding(36, 0, 0, 0);
        tv.setTextSize(18);
        return tv;
      }
    }

    ClassBean实体类:

    package com.home.xmlparsetest;
    
    import java.util.List;
    
    public class ClassBean {
      private String id;
      private String name;
      private List<StudentBean> list;
    
      public String getId() {
        return id;
      }
    
      public void setId(String id) {
        this.id = id;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public List<StudentBean> getList() {
        return list;
      }
    
      public void setList(List<StudentBean> list) {
        this.list = list;
      }
    
    }

    StudentBean:

    package com.home.xmlparsetest;
    
    public class StudentBean {
      private String id;
      private String name;
      private String sex;
    
      public String getId() {
        return id;
      }
    
      public void setId(String id) {
        this.id = id;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public String getSex() {
        return sex;
      }
    
      public void setSex(String sex) {
        this.sex = sex;
      }
    
    }

    布局文件main.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <Button
                android:id="@+id/main_btn_test1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="解析test1" />
    
            <Button
                android:id="@+id/main_btn_test2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="解析test2" />
    
            <Button
                android:id="@+id/main_btn_test3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="解析test3" />
        </LinearLayout>
    
        <ExpandableListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ExpandableListView>
    
    </LinearLayout>

    assets里面的test1.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <classList>
    
        <class id="1">一班</class>
    
        <class id="2">二班</class>
    
        <class id="3">三班</class>
    
        <class id="4">四班</class>
    
    </classList>

    assets里面的test2.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <classList>
    
        <class id="1" name="一班" >
            <student id="1" >张三       </student>
            <student id="2" >李四      </student>
        </class>
    
        <class id="2" name="二班" >
            <student id="3" >王五</student>
            <student id="4" >赵六</student>
        </class>
    
        <class id="3" name="三班" >
            <student id="5" >小明</student>
            <student id="6" >小高 </student>
        </class>
    
        <class id="4" name="四班" >
            <student id="7" >小花</student>
            <student id="8" >小红 </student>
        </class>
    
    </classList>

    assets里面的test3.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <classList>
    
        <class id="1" name="一班" >
           <student id="1" >
               <name>张三</name>
               <sex></sex>
           </student>
           <student id="2" >
               <name>李四</name>
               <sex></sex>
           </student>
        </class>
    
        <class id="2" name="二班" >
           <student id="3" >
               <name>王五</name>
               <sex></sex>
           </student>
           <student id="4" >
               <name>赵六</name>
               <sex></sex>
           </student>
        </class>
    
        <class id="3" name="三班" >
            <student id="5" >
               <name>小明</name>
               <sex></sex>
           </student>
            <student id="6" >
               <name>小高</name>
               <sex></sex>
           </student>
        </class>
    
        <class id="4" name="四班" >
           <student id="7" >
               <name>小花</name>
               <sex></sex>
           </student>
           <student id="8" >
               <name>小红</name>
               <sex></sex>
           </student>
        </class>
    
    </classList>

    http://www.tuicool.com/articles/EZrqEb

  • 相关阅读:
    做接口测试最重要的知识点
    HTTP和HTTPS区别
    UVA, 686 Goldbach's Conjecture (II)
    UVA, 543 Goldbach's Conjecture
    UVA, 580 Critical Mass
    UVA, 900 Brick Wall Patterns
    UVA, 11000 Bee
    UVA, 10079 Pizza Cutting
    C++ 向量<vector>的学习
    jenkins入门
  • 原文地址:https://www.cnblogs.com/hubing/p/4625720.html
Copyright © 2011-2022 走看看