核心技术篇:4.android网络通信之sax解析xml
2014-12-10 16:38
330 查看
[b] sax解析xml[/b]
最近工作上不是那么忙,就趁着这样的空档期学习一些平时很少接触到的知识,最近安排了一段时间来学习下网络通信这块,这两天学习了sax解析xml,这里记录一下。
其中遇到了一个很基础的问题:对arraylist的操作。现在先来总结下arraylist的相关知识:
1.什么是arraylist?--->arrsylist就是传说中的动态数组,也就是array的复杂版本。其中突出的一些特性如下:
*动态地增加和减少元素
*实现了Icollection和Ilist接口
*灵活设置数组大小
2.如何使用arraylist?--->使用add()方法增加元素;使用get()方法获取元素
好了,下面进入正题,利用sax对xml文件进行解析,这里为了测试方便,解析一个本地的xml文件:
1.先来看一下待解析的xml文件内容:
<?xmlversion="1.0"encoding="UTF-8"?>
<persons>
<personid="1">
<name>张三</name>
<age>24</age>
</person>
<personid="2">
<name>李四</name>
<age>25</age>
</person>
<personid="3">
<name>王五</name>
<age>26</age>
</person>
</persons>
xml文件存放在assets文件夹下,读取本地xml并转换为inputStream的方法如下:
this.getResources().getAssets().open("xmltest.xml");
2.进入解析的关键步骤,直接上代码,里面有详细注释:
SAXParserFactorysaxfac=SAXParserFactory.newInstance();//得到SAX解析工厂类的实例
MySAXHandlermysaxhandler=newMySAXHandler();
try{
SAXParsersaxparser=saxfac.newSAXParser();//从SAX解析工厂类中获得sax解析器
InputStreamis=MainActivity.this.getResources().getAssets().open("xmltest.xml");//将XML文档转换为输入流
saxparser.parse(is,mysaxhandler);//解析xml文档
persons=mysaxhandler.getPersons();
is.close();
Toast.makeText(MainActivity.this,persons.get(0).getName(),555).show();
}catch(ParserConfigurationExceptione){
e.printStackTrace();
}catch(SAXExceptione){
e.printStackTrace();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
a.获取sax解析工厂类的实例
b.从sax解析工厂类中获得sax解析器
c.将xml文档转换为输入流
d.调用parse()解析xml文档
3.MySAXHandler类
上述关键步骤中用到了一个类MySAXHandler,这个是sax的精华所在,通过该类实现内容处理器ContentHandler的一些回调方法,具体内容如下:
publicArrayList<Person>getPersons(){
returnpersons;
}
/*(非Javadoc)
*@seeorg.xml.sax.helpers.DefaultHandler#startDocument()
*处理文档解析开始事件
*/
publicvoidstartDocument()throwsSAXException{
this.persons=newArrayList<Person>();
System.out.println("开始解析XML文件");
}
/*(非Javadoc)
*@seeorg.xml.sax.helpers.DefaultHandler#endDocument()
*处理文档解析结束事件
*/
publicvoidendDocument()throwsSAXException{
System.out.println("结束解析XML文件");
}
/*(非Javadoc)
*@seeorg.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,java.lang.String,java.lang.String,org.xml.sax.Attributes)
*处理元素开始事件
*qName:元素名字
*/
publicvoidstartElement(Stringuri,StringlocalName,StringqName,
Attributesattributes)throwsSAXException{
this.tagName=localName;
if(this.tagName.equals("person")){//遇到根元素
person=newPerson();
person.setId(Integer.parseInt(attributes.getValue(0)));
}
}
/*(非Javadoc)
*@seeorg.xml.sax.helpers.DefaultHandler#characters(char[],int,int)
*处根据tagName获取标签的内容
*/
publicvoidcharacters(char[]ch,intstart,intlength)
throwsSAXException{
Log.e("SAXXmlContentHandler","根据tagName获取标签的内容");
if(this.tagName!=null){
Stringdata=newString(ch,start,length);
if(this.tagName.equals("name")){
this.person.setName(data);
}
elseif(this.tagName.equals("age")){
this.person.setAge(Integer.parseInt(data));
}
}
}
/*(非Javadoc)
*@seeorg.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,java.lang.String,java.lang.String)
*处理元素结束事件
*/
publicvoidendElement(Stringuri,StringlocalName,StringqName)
throwsSAXException{
if(localName.equals("person")){
this.persons.add(person);//添加一个元素到当前列表的末尾
}
this.tagName=null;
}
a.startDocument()--->处理文档解析开始事件
b.endDocument()--->处理文档解析结束事件
c.startElement()--->处理元素开始事件
d.endElement()--->处理元素结束事件
e.characters()--->处理元素字符的内容
通过以下方法可以获取解析结果:persons.get(0).getName();
期间遇到一个异常:
该异常的出现,大多是因为xml文件的编写不规范导致,经过检查发现,问题出现在:xml文件的最末尾多了一个符号:>这都是粗心导致的问题,但当时花了好一段时间来发现这问题。
最近工作上不是那么忙,就趁着这样的空档期学习一些平时很少接触到的知识,最近安排了一段时间来学习下网络通信这块,这两天学习了sax解析xml,这里记录一下。
其中遇到了一个很基础的问题:对arraylist的操作。现在先来总结下arraylist的相关知识:
1.什么是arraylist?--->arrsylist就是传说中的动态数组,也就是array的复杂版本。其中突出的一些特性如下:
*动态地增加和减少元素
*实现了Icollection和Ilist接口
*灵活设置数组大小
2.如何使用arraylist?--->使用add()方法增加元素;使用get()方法获取元素
好了,下面进入正题,利用sax对xml文件进行解析,这里为了测试方便,解析一个本地的xml文件:
1.先来看一下待解析的xml文件内容:
xml文件存放在assets文件夹下,读取本地xml并转换为inputStream的方法如下:
2.进入解析的关键步骤,直接上代码,里面有详细注释:
a.获取sax解析工厂类的实例
b.从sax解析工厂类中获得sax解析器
c.将xml文档转换为输入流
d.调用parse()解析xml文档
3.MySAXHandler类
上述关键步骤中用到了一个类MySAXHandler,这个是sax的精华所在,通过该类实现内容处理器ContentHandler的一些回调方法,具体内容如下:
a.startDocument()--->处理文档解析开始事件
b.endDocument()--->处理文档解析结束事件
c.startElement()--->处理元素开始事件
d.endElement()--->处理元素结束事件
e.characters()--->处理元素字符的内容
通过以下方法可以获取解析结果:persons.get(0).getName();
期间遇到一个异常:
该异常的出现,大多是因为xml文件的编写不规范导致,经过检查发现,问题出现在:xml文件的最末尾多了一个符号:>这都是粗心导致的问题,但当时花了好一段时间来发现这问题。
相关文章推荐
- 核心技术篇:3.android网络编程之dom解析xml
- 核心技术篇:5.android网络编程之pull解析xml
- Android网络编程之sax解析xml
- 核心技术篇:6.android网络编程之json解析
- Android网络通信之解析XML以及解析JSON
- Android-DOM、SAX、PULL解析网络xml
- Android网络之数据解析----SAX方式解析XML数据
- 【Android网络开发の2】XML之SAX方式 解析和生成XML文件
- android网络-用sax对googlemap的xml进行解析,获取经纬度
- android sax解析本地XML和网络XML
- Android核心基础-7.Android 网络通信-4.获取网络XML,JSON
- Android网络之数据解析----SAX方式解析XML数据
- :Android网络编程--XML之解析方式:SAX
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android 通过Dom, Sax, Pull解析网络xml数据
- Android网络之数据解析----SAX方式解析XML数据
- Android网络下使用SAX解析XML文档
- android中的三种xml解析方法---sax解析,pull解析,dom
- Android[中级教程]第六章 XML解析之SAX解析器