android xml解析(三)

在前面的介绍里面,争对每种特定的XML写一个特定的解析类,当需要解析的XML数量比较多时,比较烦琐,代码的重复量也比较大。在设计模式里面有一种模式叫工厂方法模式,比较适合这种情况。工厂方法模式是一种基于框架的模式,我们可以将固定不变的方法放在一个框架里(父类)实现,变化的方法定义为抽象方法,然后在子类里面实现。

具体实现如下:

1.抽象框架类:AbstractXmlParserFactory,实现如下;

public abstract class AbstractXmlParserFactory {
    protected abstract void startDocumentProcess(XmlPullParser xpp);

    protected abstract void startTagProcess(XmlPullParser xpp);

    protected abstract void textTagProcess(XmlPullParser xpp);

    protected abstract void endTagProcess(XmlPullParser xpp);
    
    protected abstract Object getParserData();

    public void parserXml(InputStream xmlStream) throws XmlPullParserException,
            IOException {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(xmlStream, "UTF-8");
        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_DOCUMENT) {
                startDocumentProcess(xpp);
            } else if (eventType == XmlPullParser.START_TAG) {
                startTagProcess(xpp);
            } else if (eventType == XmlPullParser.END_TAG) {
                endTagProcess(xpp);
            } else if (eventType == XmlPullParser.TEXT) {
                textTagProcess(xpp);
            }
            eventType = xpp.next();
        }

    }
    
    public Object exportData() {
        return getParserData();
    }
}

2.定义我们的数据类:

class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    private int age;
    private Integer id;

}

3.定义解析类PersonXmlParserFactory

public class PersonXmlParserFactory extends AbstractXmlParserFactory{
private ArrayList<Person> persons;
private Person person;
private String preTag;
    @Override
    protected void endTagProcess(XmlPullParser xpp) {
        // TODO Auto-generated method stub
         if("person".equals(xpp.getName())&&person!=null){
             persons.add(person);
             person = null;
            }
            preTag = null;
    }

    @Override
    protected void startDocumentProcess(XmlPullParser xpp) {
        // TODO Auto-generated method stub
        persons = new ArrayList<Person>();
    }

    @Override
    protected void startTagProcess(XmlPullParser xpp) {
        // TODO Auto-generated method stub
        if("person".equals(xpp.getName())){
             person = new Person();
          person.setId(new Integer(xpp.getAttributeValue(0)));
         }
         preTag = xpp.getName();
    }

    @Override
    protected void textTagProcess(XmlPullParser xpp) {
        // TODO Auto-generated method stub
        if(person!=null){
              String data = xpp.getText();
              
              if("name".equals(preTag)){
               person.setName(data);   
              }else if ("age".equals(preTag)){
               person.setAge(new Short(data));
              }
             }
            
    }

    @Override
    protected Object getParserData() {
        // TODO Auto-generated method stub
        return persons;
    }

}

4.客户端调用与 测试:

AbstractXmlParserFactory p = new PersonXmlParserFactory();
        try {
            p.parserXml(getAssets().open("person.xml"));
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

ArrayList<Person> persons = (ArrayList<Person>)p.getParserData();
        if(persons!=null) {
         for(int i=0;i<persons.size();i++) {
                Person p1 = persons.get(i);
                Log.d("minrui","p.getAge() = "+p1.getAge());
                Log.d("minrui","p.getId() = "+p1.getId());
                Log.d("minrui","p.getName() = "+p1.getName());
               }
         }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值