分别对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;
}
}
分享到:
相关推荐
Android 中利用SAX ,Dom,pull解析 XML 文件代码 每种方式都介绍了代码,具体的文档在个人博客: http://blog.csdn.net/blueskydyliu/article/details/7055311 中介绍了。
总结来说,SAX适用于处理大文件,DOM适合对XML结构进行复杂操作,而Pull解析器则在Android中提供了轻量级的解决方案。选择合适的解析方式取决于XML文件的大小、结构以及应用的需求。在实际开发中,开发者应根据具体...
例如,可以创建一个XML文件(如21.XML),然后分别用SAX、DOM和PULL解析器进行解析,对比它们的实现方式和性能差异。在学习过程中,要注意处理XML的命名空间、属性、实体引用等问题,以及错误处理和异常捕获。 为了...
在Android中,可以使用`DocumentBuilderFactory`和`DocumentBuilder`来创建和操作DOM树。通过`getElementsByTagName`、`getAttribute`等方法,可以方便地查找和操作XML元素。 然后是Pull解析器,它是Android特有的...
Android系统提供了三种主要的XML解析方式:DOM(Document Object Model)、PULL(Pull Parser)和SAX(Simple API for XML)。每种方法都有其独特的特性和应用场景,下面将详细介绍这三种XML解析方式。 1. DOM解析...
XML(eXtensible Markup ...总的来说,SAX和PULL解析适用于处理大型XML文件,节省内存,而DOM解析则提供了一种更直观的方式处理XML,但需要更多内存。根据具体的应用场景和需求,开发者可以选择合适的XML解析方法。
在Android中,有三种主要的XML解析方式:SAX(Simple API for XML)、DOM(Document Object Model)和Pull Parser。下面将详细介绍这三种解析方式,并结合person类的实例进行讲解。 1. SAX解析: SAX是一种事件驱动...
在Java中,有三种主要的解析XML的方式:SAX(Simple API for XML)、Pull解析器和DOM4J。下面将详细介绍这三种方法以及它们在Eclipse 4.8和Java 1.8环境下的使用。 1. **SAX解析器** SAX是一种基于事件驱动的解析...
本篇文章将深入探讨三种在Android中解析XML的方法:DOM(文档对象模型)、Pull(拉取解析器)和SAX(简单API for XML),并且会特别强调如何识别文件编码。 首先,DOM解析是将整个XML文件加载到内存中形成一个树形...
在Android开发中,有三种主要的XML解析技术:SAX(Simple API for XML)、DOM(Document Object Model)和PULL(Pull Parser)。下面将详细介绍这三种解析方式及其在Android中的应用。 1. SAX解析: SAX(Simple ...
下面将详细介绍这三种方法,并结合提供的"PullXmlDemo"文件,对Android中的XML解析进行深入探讨。 1. **SAX解析** SAX是一种基于事件驱动的解析器,它读取XML文件时会触发一系列事件,如开始元素、结束元素等。...
pull解析xml文件,和sax和dom一样 都可以脱离android单独使用,pull和sax的原理一样,不一样的地方是pull读取xml文件后调用方法返回的是数字, 读取到xml的声明返回数字0 START_DOCUMENT; 读取到xml的结束返回数字1 ...
如果XML文件较小,且需要对整个文档进行复杂操作,DOM解析器可能是更好的选择。在Android中,由于内存限制,通常推荐使用Pull解析器,因为它提供了更高效的内存管理和更简洁的编程模型。同时,Android SDK还提供了...
本篇文章将深入探讨Android中的三种主要XML解析方式:SAX(Simple API for XML)、DOM(Document Object Model)和Pull解析。 1. **SAX解析**: SAX解析是一种事件驱动的解析方式,它不会一次性加载整个XML文档到...
无论是哪种解析方式,读取XML文件的基本步骤都包括打开文件、创建解析器对象、设置事件处理器(对于SAX和PULL),然后启动解析。在解析过程中,根据解析器的不同,处理相应的事件。 5. 写入XML文件: 写入XML文件...
本文将深入探讨三种在Android中解析XML的主要方法:SAX(Simple API for XML)、Pull解析器和DOM(Document Object Model),并结合代码实现进行详细阐述。 **1. SAX解析** SAX(Simple API for XML)是一种事件...
下面将详细介绍在Android中使用DOM解析XML的基本步骤和关键知识点。 1. **导入XML解析库** 在Android项目中,我们不需要额外导入库,因为DOM解析器是Java标准库的一部分,已经包含在Android SDK中。这意味着你可以...
本文将深入探讨如何在Android中使用PULL解析器(Pull Parser)来解析XML文档,这是一种轻量级且高效的解析方式。 **PULL解析器概述** PULL解析器(Pull Parsing)是一种事件驱动的解析模型,它不需要完整的XML文档...
在Android中,可以使用`XmlPullParser`接口来实现PULL解析。使用PULL解析XML的步骤如下: 1. 获取`XmlPullParser`实例,例如使用`XmlPullParserFactory`的`newInstance`方法。 2. 设置输入源,可以是文件、流或其他...