先创建与XML属性对应的Bean实体类,该类中的属性和XML属性一一对应,也可以在对属性创建get和set方法。
创建的实体类如下:
public class Person{
private String id;
private String name;
private String age;
private String address;
//省略get和set方法
}
解析部分代码如下:
public class SAXXmlService extends DefaultHandler{
//定义一个Person引用
Person person=null;
//此处将XML里的数据封装成Person类,personList用于装解析后的数据
ArrayList<Person> personArr=null;
//定义一个标记变量,标记当前的XML文件被解析到哪个标签
private String currentTag=null;
//执行解析
public static ArrayList<Person> getPersonInfos(String queryString) throws Exception{
//得到SAX解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//创建解析器
SAXParser parser=factory.newSAXParser();
XMLReader xmlreader=parser.getXMLReader();
//得到输入流
URL url=new URL(queryString);
InputSource is=new InputSource(url.openStream());
//得到SAX解析实现类
SAXXmlService handler=new SAXXmlService();
xmlreader.setContentHandler(handler);
//开始解析
xmlreader.parse(is);
return handler.personArr();
}
public void characters(char[] ch,int start,int length) throws SAXException{
super.characters(ch,start,length);
//判断当前标签是否有效
if(currentTag!=null)
//读取标签里面的内容
String value=new String(ch,start,length);
//如果是Id标签,则读取Id标签的内容设置到Person到ID值上
if("id".equalsIgnoreCase(currentTag)){
person.setId(value);
}else if("name".equalsIgnoreCase(currentTag)){
person.setName(value);
}else if("age".equalsIgnoreCase(currentTag)){
person.setAge(value);
}else if("address".equalsIgnoreCase(currentTag)){
person.setAddress(value);
}
}
//解析XML时,当读到结束一个元素标签时
public void endElement(String uri,String localName,String qName)throws SAXException {
euper.endElement(uri,localName,qName);
//将当前标签置空
currentTag=null;
//如果当前结束的标签时person的话,代表一个person对象已经读取完毕。将其添
//加到list后置空
if(localName.equals("person")){
personArr.add(person);
person=null;
}
}
//解析时XMl时,当开始读取XML文档时
public void startDocument() throws SAXException{
super.startDocument();
personArr=new ArrayList<Person>();
}
//解析XML时,当开始读取一个元素标签时
public void startElement(String uri,String localName,String qName,Attributes attributes)throws SAXException{
super.startElement(uri,localName,qName,attributes);
if(localName.equal("person")){
person=new Person();
}
currentTag=localName;
}
}
通过Activity显示到手机屏幕上,Activity代码如下:
public class SAXXmlActivity extends Activity{
public static ArrayList<Person>objs=null;//所有人员信息
static final String queryString="http://172.30.40.122:8080/exa_05/xmlServlet";//路径中如果是本机IP要写局域网地址
TextView textview=null;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView=(TextView)this.findViewById(R.id.textView);
StringBuffer sb=new StringBuffer();
try{
//调用解析XML服务
objs=SAXXmlService.getPersonInfos(queryString);
if(objs!=null&&objs.size()>0){
//循环并组装字符串
for(Person person:objs){
sb.append("编号:"+person.getId()+"\n");
sb.append("姓名:"+person.getName()+"\n");
sb.append("年龄:"+person.getAge()+"\n");
sb.append("地址:"+person.getAddress()+"\n");
sb.append("\n");
}
}
//显示组装字符串到页面上
textView.setText(sb.toString());
}catch(Exception e){
e.printStackTrace();
}
}
}
Activity代码将XML解解析和显示得到相应的图片效果析出来组装成List<Person>对象,循环List再组装成字符串,然后再setText到testView中,通过解析和显示得到相应的图片效果。