`
myclover
  • 浏览: 191155 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

android中使用SAX和DOM以及Pull对xml文件进行解析

阅读更多
分别对Sax、Dom、Pull三种技术解析xml文件的实例,以及使用Pull保存xml文件。

person.xml
<?xml version="1.0" encoding="utf-8"?>
<persons>
	<person id="1001">
		<name>张三</name>
		<age>22</age>
		<sex>男</sex>
	</person>
	<person id="1002">
		<name>李四</name>
		<age>21</age>
		<sex>女</sex>
	</person>
	<person id="1003">
		<name>王五</name>
		<age>23</age>
		<sex>男</sex>
	</person>
	<person id="1004">
		<name>赵六</name>
		<age>24</age>
		<sex>女</sex>
	</person>
	<person id="1005">
		<name>孙七</name>
		<age>21</age>
		<sex>女</sex>
	</person>
</persons>


package com.myclover.xml.service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.myclover.xml.bean.Person;

/**
 * 使用Sax技术解析XML文件
 * 
 * @author myclover
 * 
 */
public class SAXParseXml {

	/**
	 * 功能描述: 通过Sax解析XML文件 xml文件格式如下: <?xml version="1.0" encoding="utf-8"?>
	 * <persons> <person id="1001"> <name>张三</name> <age>22</age> <sex>男</sex>
	 * </person> </persons>
	 * 
	 * @param ins
	 *            XML文件输入流
	 * @return 返回值:xml文件中的数据集合
	 * @throws Exception
	 */
	public List<Person> getPersonList(InputStream ins) throws Exception {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		PersonHandler handler = new PersonHandler();
		parser.parse(ins, handler);
		return handler.getPersons();
	}

	// 定义一个内部类继承DefaultHandler
	private final class PersonHandler extends DefaultHandler {

		private List<Person> persons;
		private Person person;
		private String tag;

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

		@Override
		public void startDocument() throws SAXException {
			persons = new ArrayList<Person>();
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			if ("person".equals(localName)) {
				person = new Person();
				person.setId(new Integer(attributes.getValue(0)));
			}
			tag = localName;
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			if (tag != null) {
				String data = new String(ch, start, length);
				if ("name".equals(tag)) {
					person.setName(data);
				} else if ("age".equals(tag)) {
					person.setAge(new Integer(data));
				} else if ("sex".equals(tag)) {
					person.setSex(data);
				}
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			if ("person".equals(localName)) {
				persons.add(person);
				person = null;
			}
			tag = null;
		}

	}

}


package com.myclover.xml.service;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.util.Log;
import android.util.Xml;
import com.myclover.xml.bean.Person;

/**
 * 使用Pull技术解析和保存XML文件
 * 
 * @author myclover
 * 
 */
@SuppressWarnings("all")
public class PullParseXml {

	/**
	 * 功能描述: 通过Pull解析XML文件 xml文件格式如下: <?xml version="1.0" encoding="utf-8"?>
	 * <persons> <person id="1001"> <name>张三</name> <age>22</age> <sex>男</sex>
	 * </person> </persons>
	 * 
	 * @param ins
	 *            xml文件输入流
	 * @param encoding
	 *            字符编码
	 * @return 返回值:xml文件中的数据集合
	 * @throws Exception
	 */
	public static List<Person> getPersonList(InputStream ins, String encoding)
			throws Exception {
		List<Person> persons = null;
		Person person = null;
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(ins, encoding);
		// 触发一个事件
		int event = parser.getEventType();
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				if ("person".equals(parser.getName())) {
					person = new Person();
					person.setId(new Integer(parser.getAttributeValue(0)));
				}
				if (person != null) {
					if ("name".equals(parser.getName())) {
						person.setName(parser.nextText());
					}
					if ("age".equals(parser.getName())) {
						person.setAge(new Integer(parser.nextText()));
					}
					if ("sex".equals(parser.getName())) {
						person.setSex(parser.nextText());
					}
				}
				break;
			case XmlPullParser.END_TAG:
				if ("person".equals(parser.getName())) {
					persons.add(person);
					person = null;
				}
				break;
			}
			event = parser.next();
		}

		return persons;
	}

	/**
	 * 功能描述: 通过Pull保存数据到XML文件中
	 * 
	 * @param persons
	 *            用户信息集合
	 * @param outs
	 *            输出流
	 * @param encoding
	 *            字符编码
	 * @throws Exception
	 */
	public static void saveToXml(List<Person> persons, OutputStream outs,
			String encoding) throws Exception {
		XmlSerializer xmlSer = Xml.newSerializer();
		xmlSer.setOutput(outs, encoding);
		xmlSer.startDocument(encoding, true);
		xmlSer.startTag(null, "persons");
		for (Person p : persons) {
			xmlSer.startTag(null, "person");
			xmlSer.attribute(null, "id", String.valueOf(p.getId()));
			xmlSer.startTag(null, "name");
			xmlSer.text(p.getName());
			xmlSer.endTag(null, "name");
			xmlSer.startTag(null, "age");
			xmlSer.text(String.valueOf(p.getAge()));
			xmlSer.endTag(null, "age");
			xmlSer.startTag(null, "sex");
			xmlSer.text(p.getSex());
			xmlSer.endTag(null, "sex");

			xmlSer.endTag(null, "person");
		}
		xmlSer.endTag(null, "persons");
		xmlSer.endDocument();
		outs.flush();
		outs.close();
	}

}



package com.myclover.xml.service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.myclover.xml.bean.Person;

/**
 * 使用Dom技术解析XML文件
 * 
 * @author myclover
 * 
 */
public class DomParseXml {

	/**
	 * 功能描述: 通过dom技术解析XML文件 xml文件格式如下: <?xml version="1.0" encoding="utf-8"?>
	 * <persons> <person id="1001"> <name>张三</name> <age>22</age> <sex>男</sex>
	 * </person> </persons>
	 * 
	 * @param ins
	 *            xml文件输入流
	 * @return 返回值:xml文件中数据集合
	 * @throws Exception
	 */
	public static List<Person> getPersonList(InputStream ins) throws Exception {
		List<Person> persons = new ArrayList<Person>();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document doc = builder.parse(ins);
		Element root = doc.getDocumentElement();
		NodeList personNode = root.getElementsByTagName("person");
		for (int i = 0; i < personNode.getLength(); i++) {
			Element personEle = (Element) personNode.item(i);
			int id = new Integer(personEle.getAttribute("id"));
			Person person = new Person();
			person.setId(id);
			NodeList childNode = personEle.getChildNodes();
			for (int j = 0; j < childNode.getLength(); j++) {
				if (childNode.item(j).getNodeType() == Node.ELEMENT_NODE) {
					if ("name".equals(childNode.item(j).getNodeName())) {
						person.setName(childNode.item(j).getFirstChild()
								.getNodeValue());
					} else if ("age".equals(childNode.item(j).getNodeName())) {
						person.setAge(new Integer(childNode.item(j)
								.getFirstChild().getNodeValue()));
					} else if ("sex".equals(childNode.item(j).getNodeName())) {
						person.setSex(childNode.item(j).getFirstChild()
								.getNodeValue());
					}
				}
			}
			persons.add(person);
		}

		ins.close();

		return persons;
	}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics