您的位置:首页 > 理论基础 > 计算机网络

核心技术篇: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文件的最末尾多了一个符号:>这都是粗心导致的问题,但当时花了好一段时间来发现这问题。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: