采集SAX解析XML

/***
 * 采集SAX解析XML
 * 优点:解析快,占用内在少;是采集的事件驱动模式解析的;
 * 事件驱动:它并不需要解析完整个文档,而是按内容的顺序解析文档,
 * SAX会判断当前读到的字符是否符合XML语法的某部分,如果符合就会触发事件;事件就是回调方法
 * 
 * @author Administrator
 * 
 */
public class SaxXml
{

	/**
	 * 解析后并返回一个对象集合
	 * 
	 * @param inStream
	 *            xml输入流
	 * @return 解析后并返回一个对象集合
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	public List<Person> saxParser(InputStream inStream)
			throws ParserConfigurationException, SAXException, IOException
	{
		// 创建一个生成SAX对象的工厂
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		// 新闻一个SAX解析器
		SAXParser saxParser = saxParserFactory.newSAXParser();
		// 通过这个对象来解析:是通过驱动事件解析
		PersonParser personParser = new PersonParser();
		// 把要解析的xml输入流通过personParser解析
		saxParser.parse(inStream, personParser);
		// 关闭流
		inStream.close();
		// 返回解析后对对象集合
		return personParser.getPersons();
	}

	/**
	 * 处理xml的事件类
	 * @author Administrator
	 * 
	 */
	private final class PersonParser extends DefaultHandler
	{
		private List<Person> persons = null;
		private Person person = null;
		private String TAG = null;

		public List<Person> getPersons()
		{
			return persons;
		}

		/**
		 * 当执行到第一行时就是:开始文档语法;就会执行这个方法;
		 * 这时我们创建一个Person的List集合
		 */
		public void startDocument() throws SAXException
		{
			persons = new ArrayList<Person>();
		}

		/**
		 * 当符合元素语法时就会执行这个方法;我们这里判断的是;
		 * person元素
		 */
		public void startElement(String uri, String localName, String name,
				Attributes attributes) throws SAXException
		{
			if ("person".equals(localName))
			{
				person = new Person();
				person.setId(new Integer(attributes.getValue(0)));
			}
			TAG = localName;
		}

		/**
		 * 这里是判断的是文本节点
		 */
		public void characters(char[] ch, int start, int length)
				throws SAXException
		{
			if (TAG != null)
			{
				if ("name".equals(TAG))
				{
					person.setName(new String(ch, start, length));
				} else if ("age".equals(TAG))
				{
					person.setAge(new Short(new String(ch, start, length)));
				}
			}
		}


		/**
		 * 如果一个元素执行完后.就把这个元素放到List集合里面
		 * 如:当执行到</person>时会执行这个方法
		 */
		public void endElement(String uri, String localName, String name)
				throws SAXException
		{
			if ("person".equals(localName))
			{
				persons.add(person);
				person = null;
			}
			TAG = null;
		}

	}
}

 

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="1">
		<name>secn1</name>
		<age>231</age>
	</person>
	<person id="2">
		<name>secn2</name>
		<age>232</age>
	</person>
	<person id="3">
		<name>secn3</name>
		<age>233</age>
	</person>
	<person id="4">
		<name>secn4</name>
		<age>234</age>
	</person>
</persons>

 

public void testReadSAX() throws ParserConfigurationException, SAXException, IOException{
	
		SaxXml sax = new SaxXml();
		InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("secn.xml");
		List<Person> persons = sax.saxParser(inStream);
		for(Person person:persons){
			Log.i("SaxTest", String.valueOf(person.getName()));
		}
	}

 

你可能感兴趣的:(解析xml)