关闭

Android之SAX解析XML

标签: android网络编程xmlsax
323人阅读 评论(0) 收藏 举报
分类:

     这几天想复习一下网络编程 ,  就下了一本Android4.0网络编程 ,这本书基本上全都是讲网络编程的(废话)  , 还是不错的 推荐一下 .但是看了SAX解析xml那章一下感觉讲的不大明白 , 借此补种以下 顺便打个笔记 .

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id="0001">
        <name>jialin</name>
        <age>24</age>
    </person>
     <person id="0002">
        <name>xiaolu</name>
        <age>23</age>
    </person>
<persons>

1.xml文件必须包含跟元素

2.xml必须有关闭标签

3 .xml文件对大小写敏感

4.xml文件必须有正确的嵌套

5. xml文件属性值加引号(双单均可)

6.这些东西是要引用滴

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 单引号
&quot; " 引号
7.信息像数据 , 用元素 , 信息像数据的属性 , 用属性 (最好都用元素)

 如果是带命名空间的元素<nsp:person id="0001" what="1"></nsp:person>  

 startElement()方法里传递一个String localName,这个localName在开始解析person元素的时候 ,  就是"person" ,  

 还有一个String qName ,   这个qName在Android的SAX解析里就是 "nsp:person"   ,  带命名空间的标签名

uri 就是命名空间 nsp:

attributes 参数 id="0001" 属性和属性的值  , attributes.getLocalName(i) 获得的是"id"  attributes.getValue(i) 获得的是"0001"

 如果要解析这个xml , 总体的思路是  :

类的属性 :  ArrayList<Person> persons ,  Person person,  String perTag (当前解析的标签)

1.StartDocuments()开始解析这个xml的时候的时候, new一个ArrayList<Person>

2.如果解析到person标签 , 也就是"person".equals(localName)  , (这样写的原因是为了避免空指针异常) , new 一个Person .

3.获取它的属性和属性值,  利用set方法添加到Person中 .

4.让perTag = localName .  这样在characters()方法里就可以知道 当前解析到哪个标签了

5.运行到文本内容了 , 回调 characters()方法 , 用String data = new String(ch, start, length).trim(); 这个构造方法来获得数据, 然后 调用trim()方法过滤调里面的空格

6.判断现在运行到哪个标签 .  if("name".equals(perTag)) 就是运行到name标签了,  需要做的是用set方法把 data 添加到person中 .

7.遇到了一个标签的关闭 . 回调endElement()方法,     这时候判断是哪个标签的结尾 ,    , 如果 "person".equals(localName) 这个是person的结尾 , 1. 需要把解析好的person放

入到ArrayList<Person> 中 , 2 把Person=null  .   最后为了安全不管是什么标签结尾 , 都要让perTag=null .

8.到endDocument()就处理你爱处理的事吧

 今天懒了 , 先写到这里 明天继续  =  =!

 然后是怎么用

  InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("persons.xml");
  XMLHandler handler = new XMLHandler();
  SAXParserFactory parserFactory = SAXParserFactory.newInstance();
  SAXParser parser = parserFactory.newSAXParser();
  parser.parse(is, handler);
  List<Person> list = handler.getPersons();
  is.close();
  return list;

如果不好记的话 记着一个就行了 SAXParser.parse(InputSteam , DefaultHandler) ;

InputStream 从网络, 外部存储..  都行

DefaultHanlder  XMLHanlder的子类

至于怎么获得这个SAXParser , 是用一个工厂模式获得的 , 先获得这个工厂 , 在从工厂获得这个单例 , 就OK了 .

SAXParserFactory parserFactory = SAXParserFactory.newInstance();
SAXParser parser = parserFactory.newSAXParser();

最后不要忘了关闭流哦 .



 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6104次
    • 积分:153
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:8篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论