每种技术工作原理
Dom:Dom解析器用树形结构存储文档结构,会将所有的内容加载到内存中。如果,文档过大会消耗大量的内存。
由于数据全部加载到内存中,检索和修改的速率会更高。 在android中如果文档较小,是可以采用该方法的。
Sax: Sax解析器是基于事件触发的,一旦开始,就不可倒退和停止。
当事件源产生后,调用事件处理器相应的方法处理,因此,解析速度快,使用内存少。非常适合在android移动设备中使用。
Pull: Pull解析器和Sax一样都是基于事件触发的。
它和Sax主要的区别在于:Sax是自动将事件推入注册的事件处理器处理,不能控制事件处理主动结束,而Pull解析器允许应用程序控制事件的处理——Pull允许代码主动获取解析器中的事件。
实例开发
文件——person.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>婷</name>
<age>22</age>
</person>
<person id="2">
<name>学玉</name>
<age>24</age>
</person>
</persons>
描述人物信息的bean——Person.java
package com.zt.xy.xml.bean;
public class Person {
private int mId;
private int mAge;
private String mName;
public int getmId() {
return mId;
}
public void setmId(int mId) {
this.mId = mId;
}
public int getmAge() {
return mAge;
}
public void setmAge(int mAge) {
this.mAge = mAge;
}
public String getmName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
public Person() {
}
}
Sax事件处理器—— SaxParserHandler.java
package com.zt.xy.xml.sax;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.zt.xy.xml.bean.Person;
public class SaxParserHandler extends DefaultHandler {
public static final Map<String, String> ELEMENTS_NODES = new HashMap<String, String>();
public static final Map<String, String> NODES_ATTRIBUTES = new HashMap<String, String>();
public static final String ATTRIBUTES[] = { "id" };
public static final String NODES[] = { "persons", "person", "name", "age" };
private List<Person> mPersons;
private Person mPerson;
private String mNodeTag;
static {
for (int i = 0; i < ATTRIBUTES.length; i++) {
NODES_ATTRIBUTES.put(ATTRIBUTES[i], ATTRIBUTES[i]);
}
for (int i = 0; i < NODES.length; i++) {
ELEMENTS_NODES.put(NODES[i], NODES[i]);
}
}
public boolean isNodeValid(String node) {
return ELEMENTS_NODES.containsKey(node);
}
public boolean isAttriValid(String attr) {
return NODES_ATTRIBUTES.containsKey(attr);
}
public boolean isEmpty(String str) {
if (str == null || str.length() == 0)
return true;
return false;
}
public SaxParserHandler() {
}
@Override
public void characters(char[] chs, int start, int len) throws SAXException {
if (mNodeTag != null) {
setBeanAttr(mPerson, mNodeTag, new String(chs, start, len));
}
}
@Override
public void endDocument() throws SAXException {
System.out.println("file parse end !...");
}
@Override
public void endElement(String uri, String lName, String qName)
throws SAXException {
System.out.println("end element --> lName: " + lName + " ; qName: "
+ qName);
lName = isEmpty(uri) ? qName : lName;
if (lName.equals(NODES[1])) {
mPersons.add(mPerson);
mPerson = null;
}
mNodeTag = null;
}
@Override
public void startDocument() throws SAXException {
mPersons = new ArrayList<Person>();
System.out.println("start to parse file !...");
}
@Override
public void startElement(String uri, String lName, String qName,
Attributes attr) throws SAXException {
System.out.println("lName: " + lName + " ; qName: " + qName);
lName = isEmpty(uri) ? qName : lName;
if (isNodeValid(lName)) {
mNodeTag = ELEMENTS_NODES.get(lName);
System.out.println(mNodeTag);
if (mNodeTag.equals(NODES[1])) {
mPerson = new Person();
int len = attr.getLength();
String attrStr;
for (int i = 0; i < len; i++) {
attrStr = attr.getLocalName(i);
if (isAttriValid(attrStr))
setBeanAttr(mPerson, attrStr, attr.getValue(attrStr));
}
}
}
}
private void setBeanAttr(Person p, String attrTag, String value) {
if (attrTag.equals(ATTRIBUTES[0])) {
p.setmId(Integer.parseInt(value));
} else if (attrTag.equals(NODES[2])) {
p.setmName((String) value);
} else if (attrTag.equals(NODES[3])) {
p.setmAge(Integer.parseInt(value));
}
}
public List<Person> getPersons() {
return mPersons;
}
}
测试代码——SaxParserMain.java
package com.zt.xy.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.zt.xy.xml.bean.Person;
import com.zt.xy.xml.sax.SaxParserHandler;
public class SaxParserMain {
public SaxParserMain() {
}
public static void main(String[] args) {
InputStream is = SaxParserMain.class.getClassLoader()
.getResourceAsStream("person.xml");
SAXParserFactory fac = SAXParserFactory.newInstance();
if (is != null) {
try {
SAXParser sp = fac.newSAXParser();
SaxParserHandler handler = new SaxParserHandler();
sp.parse(is, handler);
List<Person> pers = handler.getPersons();
Iterator itr = pers.iterator();
Person p;
while (itr.hasNext()) {
p = (Person) itr.next();
System.out.println("name: " + p.getmName() + "\tid: "
+ p.getmId() + "\tage: " + p.getmAge());
}
is.close();
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("InputStream is null !...");
}
}
}
直接根据dom节点标记处理(一切都在掌控之中)——DomParserMain.java
package com.zt.xy.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.zt.xy.xml.bean.Person;
public class DomParserMain {
public static void main(String[] args) {
List<Person> pers = new ArrayList<Person>();
InputStream is = DomParserMain.class.getClassLoader()
.getResourceAsStream("person.xml");
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = fac.newDocumentBuilder();
if (is == null) {
System.out.println("Input Stream is null !...");
return;
}
Document doc = db.parse(is);
Element root = doc.getDocumentElement();
NodeList nl = root.getElementsByTagName("person");
int len = nl.getLength();
Element n;
Person p;
NodeList nl2;
for (int i = 0; i < len; i++) {
n = (Element) nl.item(i);
p = new Person();
p.setmId(Integer.parseInt(n.getAttribute("id")));
nl2 = n.getChildNodes();
for (int j = 0; j < nl2.getLength(); j++) {
Node childNode = nl2.item(j);
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
if ("name".equals(childNode.getNodeName())) {
p.setmName(childNode.getTextContent());
} else if ("age".equals(childNode.getNodeName())) {
p.setmAge(Integer.parseInt(childNode
.getTextContent()));
}
}
}
pers.add(p);
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
for (int i = 0; i < pers.size(); i++) {
Person p = (Person) pers.get(i);
System.out.println("name: " + p.getmName() + "\tid: " + p.getmId()
+ "\tage: " + p.getmAge());
}
}
}
Pull解析器(java环境中使用kxml2-2.3.0.jar和xmlpull_1_1_3_4c.jar)——PullParserMain.java
/**
*
*/
package com.zt.xy.xml;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import com.zt.xy.xml.bean.Person;
//http://www.findjar.com/jar/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar.html
public class PullParserMain {
private static String curTag = null;
public static void main(String[] args) {
System.out.println(System.getProperty("user.dir") + File.separator
+ "src" + File.separator + "person.xml");
InputStream is = PullParserMain.class.getClassLoader()
.getResourceAsStream("person.xml");
List<Person> pers = null;
Person person = null;
if (is != null) {
XmlPullParserFactory fac;
try {
fac = XmlPullParserFactory.newInstance();
fac.setNamespaceAware(true);
XmlPullParser parser = fac.newPullParser();
parser.setInput(is, "utf-8");
int eType = parser.getEventType();
do {
switch (eType) {
case XmlPullParser.START_DOCUMENT:
// System.out.println("start to parse file !...");
pers = new ArrayList<Person>();
break;
case XmlPullParser.END_DOCUMENT:
// System.out.println("file parser end !... ");
break;
case XmlPullParser.START_TAG:
// System.out.println(parser.getName());
curTag = parser.getName();
if (parser.getName().equals("person")) {
person = new Person();
person.setmId(Integer.parseInt(parser
.getAttributeValue(0)));
}
break;
case XmlPullParser.END_TAG:
// System.out.println(parser.getName());
if (parser.getName().equals("person")) {
pers.add(person);
}
curTag = null;
break;
case XmlPullParser.TEXT:
// System.out.println(parser.getText());
if (!isEmpty(person)) {
if (curTag != null && curTag.equals("name")) {
// System.out.print(parser.getText()+"\t");
person.setmName(parser.getText());
} else if (curTag != null && curTag.equals("age")) {
// System.out.print(parser.getText()+"\t");
person.setmAge(Integer.parseInt(parser
.getText()));
}
}
break;
}
eType = parser.next();
} while (eType != XmlPullParser.END_DOCUMENT);
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
System.out.println("file path error !... ");
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("persons length : " + pers.size());
if (pers.size() > 0) {
for (int i = 0; i < pers.size(); i++) {
Person p = (Person) pers.get(i);
System.out.println("name: " + p.getmName() + "\tid: "
+ p.getmId() + "\tage: " + p.getmAge());
}
}
}
private static boolean isEmpty(Person person) {
return person == null;
}
}
kxml2-2.3.0.jar和xmlpull_1_1_3_4c.jar下载地址:
http://download.youkuaiyun.com/detail/sun_star1chen/6200053