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

本文介绍了如何使用SAX、DOM、Pull三种技术解析XML文件,并提供了详细的Java代码实现。同时,还展示了如何使用Pull技术来保存XML文件的数据。通过实际案例,深入理解XML解析的不同方法及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

person.xml
[code]
<?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>
[/code]

[code]
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;
}

}

}
[/code]

[code]
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();
}

}

[/code]

[code]
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;
}
}

[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值