在前面的介绍里面,争对每种特定的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
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());
}
}