android中运用sax解析xml

android中使用sax解析xml

SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:
解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

阅读ContentHandler API文档,常用方法:startElement、endElement、characters

Sax解析的流程:
1.使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
2.通过SAX解析工厂得到解析器对象  
SAXParser sp = spf.newSAXParser();
3.通过解析器对象得到一个XML的读取器
XMLReader xmlReader = sp.getXMLReader();
4.设置读取器的事件处理器  
xmlReader.setContentHandler(new BookParserHandler()); 其中BookParserHandler extends DefaultHandler
5.解析xml文件 

xmlReader.parse("book.xml"); book.xml需放在工程下的src目录或者是:xmlReader.parse("D:\\test\\person.xml")
第二种方法是xmlReader.parse(InputStream);
通常我都是用读取输入流的方式(xmlReader.parse(InputStream))去解析 不管使用文件还是从网络上获取文件 终极都是转化为输入流读到内存中进行解析
同时还会把3-5步骤 会写在一起parse(InputStream is, DefaultHandler dh)

 

 

extends DefaultHandler 就是主要的编码工作 添加未实现的方法

首先设置一个标志boolean flag =true或者private String currentElement; 用来记住当前元素的名称 当保存文本节点后 将flag =false 或者currentElement=“”

1.public void characters(char[] ch, int start, int length)
    throws SAXException  {} 用来读取元素的下一个文本节点 如String content=new String(ch,start,length);

将读到的内容存到Person bean中

public void characters(char[] ch, int start, int length)
				throws SAXException 
		{
			String content=new String(ch,start,length);//元素的下一个文本节点
			//读到 name age元素的时候 读取内容将其保存到bean中
			if("name".equals(currentElement))
			{
				person.setName(content);
				
			}else if("age".equals(currentElement))
			{
				person.setAge(new Short(content));
			}
			
			
		}

 

 2.startElement开始元素事件

 

		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException 
		{
			//当元素有属性值的时候就先属性值保存到 bean 
			if("person".equals(qName))
			{	
				person=new Person();
				
				person.setId(Integer.parseInt(attributes.getValue("id")));
				
				
			}else if("name".equals(qName)||"age".equals(qName))
			{
				//保持当前元素名称
				currentElement = qName;
			}
			
		}

 

 

 3.endElement结束元素事件

 

public void endElement(String uri, String localName, String qName)
				throws SAXException 
		{
			
			if("person".equals(qName))
			{	
				persons.add(person);
				
			}else if("name".equals(qName)||"age".equals(qName))
			{	//读到结束元素到时候将currentElement设置为null,以便读到下一个元素的时候可以记住
		
				
				currentElement = "";
			}
	
		}

 

 

 

 表达能力有限可以看我附件中说明  希望对各位有帮助