Chinaunix首页 | 论坛 | 博客
  • 博客访问: 381136
  • 博文数量: 61
  • 博客积分: 1546
  • 博客等级: 中尉
  • 技术积分: 708
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-22 20:07
文章分类

全部博文(61)

文章存档

2011年(61)

分类: 嵌入式

2011-06-19 22:05:10

android系统支持使用SAX、DOM或者pull读取xml文件(建议不要使用DOM解析-它比较耗内存)

SAX是一个解析速度快并且占用内存少的xml解析器。它解析的时候采用事件驱动。
即它不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法的XML语法的某部分,
如果符合,则会调用某个回调方法——这些方法定义在ContentHandle接口中。

startDocument()
当遇到文档的开头的时候,调用该方法,可以做一些预处理的工作

endDocument()
当文档结束的时候,调用该方法,可以做一些善后工作

startElement(String namespaceURI,String localName,String qName,Attributes attr)
当读到一个开始标签的时候,会触发这个方法
参数分别为:命名空间、不带命名空间的标签名、带命名空间的标签名、得到的所有属性名和相应的值

endElement(String uri,String localName,String name)
在遇到结束标签的时候,调用该方法

characters(char[] ch,int start,int length)
这个方法来处理在xml文件中读到的内容,第一个参数用于存放文件的内容,后面的两个参数是读到的字符串
在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容

如有以下xml文件
 
LiMing
30
XiaoZhang
25

解析过程触发的事件为:
读到的标签及内容 触发事件
{文档开始} startDocument()
startElement("","persons",null,"{Attributes}")
"\n\t" characters("...","12","2")
startElement("","person",null,"{Attributes}")
"\n\t\t" characters("...","31","3")
startElement("","name",null,"{Attributes}")
"LiMing" characters("...","40","2")
endElement("","name",null)
"\n\t\t" characters("...","50","3")
startElement("","age",null,"{Attributes}")
"30" characters("...","58","2")
endElement("","age",null)
"\n\t" characters("...","67","2")
endElement("","person",null)
"\n\t" characters("...","79","2")
startElement("","person",null,"{Attributes}")
"\n\t\t" characters("...","98","3")
startElement("","name",null,"{Attributes}")
"XiaoZhang" characters("...","107","3")
endElement("","name",null)
"\n\t\t" characters("...","118","3")
startElement("","age",null,"{Attributes}")
"25" characters("...","126","2")
endElement("","age",null)
"\n\t\t" characters("...","135","2")
endElement("","person",null)
"\n" characters("...","147","1")
endElement

写了一个sax解析程序,来解析该xml文件
  1. import org.xml.sax.Attributes;
  2. import org.xml.sax.SAXException;
  3. import org.xml.sax.helpers.DefaultHandler;

  4. public class StudentInfoContentHandler2 extends DefaultHandler {

  5.     @Override
  6.     public void characters(char[] ch, int start, int length) throws SAXException {
  7.         if(person!=null) {
  8.             String data = new String(ch, start, length);
  9.             if("name".equals(tagName)) {
  10.                 person.name = data;
  11.             } else if("age".equals(tagName)) {
  12.                 person.age = Integer.valueOf(data);
  13.             }
  14.         }
  15.     }

  16.     @Override
  17.     public void endDocument() throws SAXException {
  18.         for(Person p : personList) {
  19.             System.out.println(p);
  20.         }
  21.     }

  22.     @Override
  23.     public void endElement(String uri, String localName, String qName) throws SAXException {        
  24.         if("person".equals(qName)) {
  25.             personList.add(person);
  26.             person = null;            
  27.         }
  28.         tagName = null;
  29.     }

  30.     @Override
  31.     public void startDocument() throws SAXException {
  32.         personList = new ArrayList<Person>();
  33.     }

  34.     @Override
  35.     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  36.         if("person".equals(qName)) {                    
  37.             person = new Person();
  38.             person.id = Integer.valueOf(attributes.getValue("id"));
  39.         } else {
  40.             
  41.         }
  42.         tagName = qName;
  43.     }
  44.     
  45.     List<Person> personList;
  46.     Person person;
  47.     String tagName;
  48. }


  49. class Person
  50. {
  51.     @Override
  52.     public String toString() {
  53.         return "id=" + id + " name=" + name + " age=" + age;
  54.     }
  55.     public int id;
  56.     public String name;
  57.     public int age;
  58.     
  59. }

写了一个测试程序,来测试解析过程是否正确:
  1. import java.io.File;
  2. import java.io.IOException;

  3. import javax.xml.parsers.ParserConfigurationException;
  4. import javax.xml.parsers.SAXParser;
  5. import javax.xml.parsers.SAXParserFactory;

  6. import org.xml.sax.SAXException;


  7. public class SAX_XML_Parser {

  8.     public static void main(String[] args) {        
  9.         try {
  10.             readXml();
  11.         } catch (ParserConfigurationException e) {
  12.             // TODO Auto-generated catch block
  13.             e.printStackTrace();
  14.         } catch (SAXException e) {
  15.             // TODO Auto-generated catch block
  16.             e.printStackTrace();
  17.         } catch (IOException e) {
  18.             // TODO Auto-generated catch block
  19.             e.printStackTrace();
  20.         }
  21.     }

  22.     private static void readXml() throws ParserConfigurationException, SAXException, IOException {
  23.         File file = new File("C:/studentInfo.xml");
  24.         SAXParserFactory spf = SAXParserFactory.newInstance();
  25.         SAXParser saxParser = spf.newSAXParser();
  26.         //saxParser.setProperty("", true);
  27.         StudentInfoContentHandler2 handler = new StudentInfoContentHandler2();
  28.         saxParser.parse(file, handler);        
  29.     }    
  30. }

输出结果:
id=10 name=LiMing age=25
id=20 name=XiaoZhang age=30

阅读(2658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~