Android学习笔记 - XML篇

来源:互联网 发布:skytv软件下载 编辑:程序博客网 时间:2024/05/14 22:06

1.什么是SAX
 DOM的原理:把一个XML文档当成树,完全加载到内存中,不适合大文件处理
 SAX的原理:逐行进行XML文档的解析,适合大文件处理,但操作较复杂,且添加节点麻烦
 SAX = Simple API for XML
 
2.SAX基本原理
 顺序逐行扫描,当扫描到文档开始与结束、元素开始与结束触发事件,以事件为驱动。
 相关事件:
  1.在文档开始和结束的时候处理事件
  2.在文档内每一个XML元素接受解析前后触发事件
  3.任何元数据通常都由单独的事件交付
  4.在处理文档的DTD或Schema时产生事件
  5.发生错误时产生事件


 相关类:
  SAXParserFactory //SAX工厂类
  SAXParser //SAX解析类
  SAXReader //SAX读取类
  ContentHandler //内容事件
  ErrorHandler //错误事件
  DTDHandler //DTD事件
  EntityResolver //元素事件


 解析过程:
  <doc>
   <para>Hello Android</para>
  </doc>
  start document
  start element : doc
  start element : para
  characters : Hello Android
  end element : para
  end element : doc
  end document


 解析步骤:
  1.创建事件处理程序
  2.创建SAX解析器
  3.将事件处理程序分配给解析器
  4.对文档进行解析,将每个事件发送给处理程序
 
3.SAX常用接口
 ContentHandler接口
  void startDocument()
  void endDocument()
  void startElement(String uri, String localName, String qName, Attributes atts)
  void endElement(String uri, String localName, String qName)
  void characters(char[] ch, int start, int length)

4.SAX解析

String xml = new DownloadHelper().DownloadString("http://...");SAXParserFactory factory = SAXParserFactory.newInstance(); //创建工厂类XmlReader reader = factory.newSAXParser().getXmlReader(); //获取读取器reader.setContentHandler(new MyContentHandler());reader.parse(new InputSourse(new StringReader(xml)));public MyContentHandler extends DefaultHandler{public void startDocument() throws SAXException{System.out.println("start read...");}public void endDocument() throws SAXException{System.out.println("end read...");}public void startElement(String nsUri, String localName, String qName, Attributes atts) throws SAXException{//nsUri : 名字空间//localName : 节点名称//qName : 带前缀的节点名称//attr : 节点的属性if(localName.equals("worker")){for(int i=0; i<attr.getLength; i++){System.out.println(attr.getLocalName(i) + ":" + attr.getValue(i));}}}public void endElement() throws SAXException{}public void characters(char[] ch, int start, int length) throws SAXException{//ch 节点中的内容(InnerText)//start 从ch中的哪一位开始//length 长度String tmp = new String(ch, start, len);}}