xml 해석 의 SAX 해석 과 PULL 해석

1: user. xml 프로필 을 분석 합 니 다.
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person>
		<name>  </name>
		<age>30</age>
		<sex> </sex>	
	</person>
	<person>
		<name>  </name>
		<age>32</age>
		<sex> </sex>
	</person>
	<person>
		<name>wangwu</name>
		<age>30</age>
		<sex> </sex>
	</person>
</persons>
 
   
1.SAX解析过程:
创建一个MyHandler类继承DefaultHandler,重写startDocument、startElement、characters、endElement 、endDocument这些方法。

/*DefaultHandler

SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。实际上只要继承DefaultHandler 类 ,再覆盖一部分 处理事件的方法 同样可以达到相同的效果。 实际上DefaultHandler就是实现了上面的四个事件处理器接口,然后提供了每个抽象方法的默认实现。)

以下是JDK API 1.6中的原文解释:

DefaultHandler是SAX2 事件处理程序的默认基类。

此模块(包括源代码和文档)位于公共域中,对该模块不提供担保有关更多信息,请参阅 http://www.saxproject.org。

此类可用作 SAX2 应用程序的有用基类:它提供四个核心 SAX2 处理程序类中的所有回调的默认实现:

  • EntityResolver
  • DTDHandler
  • ContentHandler
  • ErrorHandler

应用程序编写者可以在他们仅需实现部分接口时扩展此类;当应用程序尚未提供其自己的处理程序时解析器编写者可通过实例化此类来提供默认的处理程序。

此类替换不推荐使用的 SAX1 HandlerBase 类。

*/

创建一个实体person类存储解析出来的数据。具体实现代码如下:
person实体类:
package com.qianfeng.saxparser1;

public class Person {
	private String name;
	private int age;
	private String sex;

	public Person() {
		// TODO Auto-generated constructor stub
	}

	public Person(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}
	
	

}

Myhandler 클래스
package com.qianfeng.saxparser1;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyHandler extends DefaultHandler {
	private List<Person> list;
	private Person person;
	private String tagName;
	//             
	@Override
	public void startDocument() throws SAXException {
		System.out.println("       ...");
		list = new ArrayList<Person>();
	}
	
	//             
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		//     
		tagName = qName;
		System.out.println("       ...."+qName);
		if("person".equals(qName))
		{
			person = new Person();
		}
		
	}
	//             
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String content = new String(ch,start,length);
		System.out.println("       ...."+content);
		if("name".equals(tagName))
			person.setName(content);
		else if("age".equals(tagName))
			person.setAge(Integer.parseInt(content));
		else if("sex".equals(tagName))
			person.setSex(content);
		
	}
	
	//             
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		//  
		tagName="";//                 ,    characters  
		System.out.println("       ...."+qName);
		if("person".equals(qName))
		{
			list.add(person);
		}
	}
	
	//             
	@Override
	public void endDocument() throws SAXException {
		System.out.println("       .....");
	}
    //    
	public List<Person> getList() {
		return list;
	}
	

}

테스트 주 방법:
package com.qianfeng.saxparser1;


import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class Test {

	/**
	 * @param args
	 * @throws SAXException 
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 */
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		
		//  SAX       
		SAXParserFactory factory = SAXParserFactory.newInstance();
		
		//  SAX     
		SAXParser parser = factory.newSAXParser();
		
		//          
		File file = new File("user.xml");
		
		//  Handler  
		MyHandler handler = new MyHandler();
		
		//         ,   handler    
		parser.parse(file, handler);
		
		List<Person> list = handler.getList();
		
		for(Person person:list)
		{
			System.out.println(person);
		}
		
		

	}

}


2. pull 분석 과정
XmlPull 은 Sax 와 유사 합 니 다. 스 트림 (stream) 을 기반 으로 파일 을 조작 한 다음 노드 이벤트 에 따라 개발 자가 작성 한 처리 프로그램 입 니 다.스 트림 기반 처리 이기 때문에 Xmlpull 과 Sax 는 메모리 자원 을 비교적 절약 하고 Dom 처럼 모든 노드 를 떡갈나무 형식 으로 메모리 에 보 여 주지 않 습 니 다.그러나 Xmlpull 은 Sax 보다 더 간단명료 하 며 전체 흐름 을 스 캔 할 필요 가 없다.관심 있 는 사건 을 switch 로 처리 할 수 있 습 니 다.switch 문 구 를 while 순환 에 넣 습 니 다.parser. next () 가 존재 할 때 계속 반복 적 으로 실 행 됩 니 다.
주의: xml 의   이 말 은 빈 칸 을 두 지 말고 꼭 표시 해 야 한다. 그렇지 않 으 면 틀 리 면 디 버 깅 하기 어렵다.
Android 에서: Pull 은 Android 에 내 장 된 xml 해상도 입 니 다.Pull 해상도 기의 실행 방식 과 SAX 해상도 가 비슷 하 다.이것 은 유사 한 이 벤트 를 제공 합 니 다. 예 를 들 어 시작 요소 와 끝 요소 이 벤트 는 parser. next () 를 사용 하면 다음 요소 에 들 어가 서 해당 이 벤트 를 촉발 할 수 있 습 니 다.이 벤트 는 수치 코드 로 전송 되 므 로 관심 있 는 이 벤트 를 switch 로 처리 할 수 있 습 니 다.요소 가 분석 되 기 시 작 했 을 때 parser. nextText () 방법 을 사용 하면 다음 Text 형식 노드 의 값 을 얻 을 수 있 습 니 다.
프로 세 스: XmlPullParserFactory 공장 을 만 들 고 공장 을 통 해 XmlPullParser 해상도 기 를 가 져 와 분석 할 파일 을 만 들 고 parser. setInput () 방법 으로 해상도 기 를 기록 합 니 다 (인 코딩 문제 주의).코드 참조:
package com.qianfeng.pullparser1;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

public class PullParser {
	
	
	public List<Person> pullParser() throws XmlPullParserException, IOException
	{
		List<Person> list = null;
		Person person = null;
		//  pull       
		XmlPullParserFactory  factory = XmlPullParserFactory.newInstance();
		
		//  pull     
		XmlPullParser parser = factory.newPullParser();
		
		//FileReader fr = new FileReader("user.xml");
		FileInputStream fis = new FileInputStream("user.xml");
		parser.setInput(fis, "utf-8");
		
		//            
		int event = parser.getEventType();
		while(event!=XmlPullParser.END_DOCUMENT)
		{
			switch(event)
			{
				case XmlPullParser.START_DOCUMENT:
					 list = new ArrayList<Person>();
					 break;
				case XmlPullParser.START_TAG:
					 //      
					String tagName = parser.getName();
					if("person".equals(tagName))
						person = new Person();
					else if("name".equals(tagName))
						person.setName(parser.nextText());
					else if("age".equals(tagName))
						person.setAge(Integer.parseInt(parser.nextText()));//          
					else if("sex".equals(tagName))
						person.setSex(parser.nextText());
					break;
				case XmlPullParser.END_TAG:
					if("person".equals(parser.getName()))
					{
						list.add(person);
						person = null;
					}
					break;
			}
			//       
			event = parser.next();
		}
		return list;
	}

	/**
	 * @param args
	 * @throws IOException 
	 * @throws XmlPullParserException 
	 */
	public static void main(String[] args) throws XmlPullParserException, IOException {
		
//		System.out.println(XmlPullParser.START_DOCUMENT);
//		System.out.println(XmlPullParser.START_TAG);
//		System.out.println(XmlPullParser.END_TAG);
//		System.out.println(XmlPullParser.END_DOCUMENT);
		
		PullParser pullParser = new PullParser();
		List<Person> list = pullParser.pullParser();
		
		for(Person person:list)
		{
			System.out.println(person);
		}

	}

}












좋은 웹페이지 즐겨찾기