Xstream解析XML文件

我们举一个小例子 讲解一下我们的xml解析
下面这个是我们需要解析的xml文件

<root><resultcode>200</resultcode><reason>success</reason><result><item><id>242</id><catalog>中国文学</catalog></item><item><id>252</id><catalog>人物传记</catalog></item><item><id>244</id><catalog>儿童文学</catalog></item><item><id>248</id><catalog>历史</catalog></item><item><id>257</id><catalog>哲学</catalog></item><item><id>243</id><catalog>外国文学</catalog></item><item><id>247</id><catalog>小说</catalog></item><item><id>251</id><catalog>心灵鸡汤</catalog></item><item><id>253</id><catalog>心理学</catalog></item><item><id>250</id><catalog>成功励志</catalog></item><item><id>249</id><catalog>教育</catalog></item><item><id>245</id><catalog>散文</catalog></item><item><id>256</id><catalog>理财</catalog></item><item><id>254</id><catalog>管理</catalog></item><item><id>246</id><catalog>经典名著</catalog></item><item><id>255</id><catalog>经济</catalog></item><item><id>258</id><catalog>计算机</catalog></item></result><error_code>0</error_code></root>

拿到我们需要解析的文件 首先我们需要封装javabean
下面就看一下我们实现的javabean

首先最里层的类的封装是

public class Book {
    private String id;
    private String catalog;
    //对属性进行封装
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getCatalog() {
        return catalog;
    }
    public void setCatalog(String catalog) {
        this.catalog = catalog;
    }
}

次外层的集合的封装是 在这个包含集合的封装类中 我们需要添加注解 第一个注解就是集合的标识 第二个注解就是集合外层的对象的标识

import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
@XStreamAlias("result")
public class Books {
    @XStreamImplicit(itemFieldName="item")
    private List<Book> item;
    //对属性进行封装
    public List<Book> getItem() {
        return item;
    }

    public void setItem(List<Book> item) {
        this.item = item;
    }
}

下面让我们看一下最外面的的类的封装 最外层的封装类中我们也需要添加注解 就是最外层的对象的注解

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("root")
public class Bookss {
    private Books result;
    private String resultcode;
    private String reason;
    private String error_code;

    public Books getResult() {
        return result;
    }
    public void setResult(Books result) {
        this.result = result;
    }
}

在上面的三个封装类中 提醒我们非常注意的是在xml的解析中 所有的属性我们必须全部封装到 不能说用不到的属性就不封装了 否则会报错 你中招了吗?

javabean写完了 我们就要实现解析了 下面让我们展示一下解析的demo

import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import com.example.adapter.MyXMLAdapter;
import com.example.bean.Book;
import com.example.bean.Bookss;
import com.thoughtworks.xstream.XStream;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {
    //定义控件
    private  ListView lv;
    private List<Book> list;
    private MyXMLAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv=(ListView) findViewById(R.id.lv);
        getdata();
    }
    private void getdata() {
        new Thread(){
            public void run() {
                String url="http://apis.juhe.cn/goodbook/catalog?key=9d6ef8c31647a206e05fcaff70527182&dtype=xml";
                XStream xStream=new XStream();
                xStream.processAnnotations(Bookss.class);
                try {
                    Bookss xml = (Bookss) xStream.fromXML(new URL(url));
                    list = xml.getResult().getItem();
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            adapter=new MyXMLAdapter(MainActivity.this, list);
                            lv.setAdapter(adapter);                     
                        }
                    });
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            };
        }.start();

    }

}

当然还是少不了我们的适配器
下面看一下我们适配器中的实现代码

import java.util.List;
import com.example.bean.Book;
import com.example.test.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyXMLAdapter extends BaseAdapter {
    private Context context;
    private List<Book> list;

    public MyXMLAdapter(Context context, List<Book> list) {
        super();
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView==null) {
            viewHolder=new ViewHolder();
            convertView=LayoutInflater.from(context).inflate(R.layout.list_item, null);
            viewHolder.bookType=(TextView) convertView.findViewById(R.id.booktype);
            convertView.setTag(viewHolder);
        }else {
            viewHolder=(ViewHolder) convertView.getTag();
        }
        viewHolder.bookType.setText(list.get(position).getCatalog());
        return convertView;
    }

    class ViewHolder{
        TextView bookType;
    }

}

适配文件中的布局文件的代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/booktype"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="34dp"
        android:layout_marginTop="19dp"
        android:text="TextView" />

</RelativeLayout>

最后我们将解析的数据使用listview展示一下 在此之前我们的布局文件是

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    >
    <ListView 
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        ></ListView>


</RelativeLayout>

接近尾声 让我们一起看一下我们的效果展示吧
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值