这几天想复习一下网络编程 , 就下了一本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.这些东西是要引用滴
< | < | 小于 |
> | > | 大于 |
& | & | 和号 |
' | ' | 单引号 |
" | " | 引号 |
如果是带命名空间的元素<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();
最后不要忘了关闭流哦 .