android中XML文件的解析

先创建与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中,通过解析和显示得到相应的图片效果。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值