做android开发的掌握一两种解析xml的技术是很重要的,今天和大家分享下,怎么在android中利用SAX解析xml。
这里不对sax做过多的介绍,推荐读者去查看:点击打开链接。这样我们的内容就变的简单了。
下面先看一下我们要解析的xml文档内容:
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="001">
<name>ZengZhiyuan</name>
<sex>male</sex>
<age>21</age>
<address>yibin of sichuan</address>
</user>
<user id="002">
<name>LuHongling</name>
<sex>female</sex>
<age>19</age>
<address>luzhou of sichuan</address>
</user>
</users>
我们的Activity类
public class XMLActivity extends Activity {
private Button saxbutton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
saxbutton = (Button)findViewById(R.id.saxbutton);
saxbutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//这里不对怎么下载做解释,可以去参考我以前的文章
HttpDownloader http = new HttpDownloader();
//注意这里不要用localhost或者127.0.0.1,会报错的,因为android里是10.0.2.2
String txt = http
.download("http://10.0.2.2:8080/examples/users.xml");
System.out.println(txt);
try {
//创建一个SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader();
//为XMLReader设置内容处理器
reader.setContentHandler(new MyContentHandler());
//开始解析
reader.parse(new InputSource(new StringReader(txt)));
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
最后我们继承DefaultHandler的MyContentHandler.java
/**
* DefaultHandler实现了ContentHandler、DTDHandler、EntityResolver、ErrorHandler
*
*/
public class MyContentHandler extends DefaultHandler{
String tagName,name,sex,age,address;
@Override
public void startDocument() throws SAXException {
System.out.println("开始解析xml");
}
@Override
public void endDocument() throws SAXException {
System.out.println("解析xml完成");
}
/* uri:xml命名空间的uri
* localName:不带前缀的标签名,如:<xs:name id="1">中name
* qName:带前缀的标签名,如:上面的xs:name
* attributes:标签里面的所有属性如“id="001"”
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//把正在解析的标签名字付给tagName,方便后面在characters中好判断
tagName=localName;
if(localName.equals("user")){
for(int i=0;i<attributes.getLength();i++){
System.out.println(attributes.getLocalName(i)+"="+attributes.getValue(i));
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//当结束一个大标签时,我们打印解析到的内容
if(localName.equals("user")){
System.out.println("name:"+name);
System.out.println("sex:"+sex);
System.out.println("age:"+age);
System.out.println("address:"+address);
}
}
/* 注意:
* 你的xml文件最好不要同回车、制表符等,因为当characters方法遇到这些符号时,
* 也会执行,这样就会导致解析到空字符串,带来误解。
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tagName.equals("name")){
name = new String(ch,start,length);
}else if(tagName.equals("sex")){
sex = new String(ch,start,length);
}else if(tagName.equals("age")){
age = new String(ch,start,length);
}else if(tagName.equals("address")){
address = new String(ch,start,length);
}
}
}