android读取xml的三种方法,dom,sax和pull

来源:互联网 发布:网络语言暴力调查问卷 编辑:程序博客网 时间:2024/05/21 09:12

工程文件如下:


 

生成的test.xml格格式如下:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<datas version="1">
<papers number="2">
<paper>
<id>1</id>
<cate>0</cate>
<p_name>10年3月四级</p_name>
<p_date>2010.3.24</p_date>
</paper>
<paper>
<id>2</id>
<cate>0</cate>
<p_name>10年12月四级</p_name>
<p_date>2010.12.24</p_date>
</paper>
</papers>
<questions number="3">
<question>
<id>1</id>
<p_id>0</p_id>
</question>
<question>
<id>2</id>
<p_id>0</p_id>
</question>
<question>
<id>3</id>
<p_id>0</p_id>
</question>
</questions>
</datas>

读取生成xml的类,以及三种方法:

package com.fzh.xml;


import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.widget.TextView;


public class ReadXmlAct extends Activity {


private static final String TAG = "ReadXmlAct";
private TextView tv;


private ArrayList<PaperItem> papers = new ArrayList<PaperItem>();
private ArrayList<QuestionItem> questions = new ArrayList<QuestionItem>();


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


tv = (TextView) findViewById(R.id.tv);


tv.post(new Runnable() {
@Override
public void run() {
String text = getXmlStr();
// Log.d(TAG, "ReadXmlAct = " + text);
}
});
}


public String getXmlStr() {
write("test.xml", makeXml());
// String text1 = readXMLByDOM();
XmlBean xmlBean = null;
// xmlBean = readXMLBySAX();


xmlBean = readXMLByPull();


Log.i(TAG, "paperNum =  " + xmlBean.paperNum + "-- questionNum = "
+ xmlBean.questionNum);


Log.i(TAG, "paperNum =  " + xmlBean.papers.size() + "-- questionNum = "
+ xmlBean.questions.size());


for (int i = 0; i < xmlBean.papers.size(); i++)
Log.i(TAG, "readXMLBySAX() ----- > papers======  "
+ xmlBean.papers.get(i));
for (int i = 0; i < xmlBean.questions.size(); i++)
Log.i(TAG, "readXMLBySAX() ----- > questions======  "
+ xmlBean.questions.get(i));
// String text2 = readXMLBySAX();
return "";
}


private String makeXml() {
XmlSerializer serializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
try {
serializer.setOutput(writer);
// <?xml version="1.0″ encoding="UTF-8″ standalone="yes"?>
serializer.startDocument("UTF-8", true);
// <datas version="1″>
serializer.startTag("", "datas");
serializer.attribute("", "version", String.valueOf(1));


// <papers number="2″>
serializer.startTag("", "papers");
serializer.attribute("", "number", "2");


serializer.startTag("", "paper");
// <id>1</id>
serializer.startTag("", "id");
serializer.text("1");
serializer.endTag("", "id");
serializer.startTag("", "cate");
serializer.text("0");
serializer.endTag("", "cate");
serializer.startTag("", "p_name");
serializer.text("10年3月四级");
serializer.endTag("", "p_name");
serializer.startTag("", "p_date");
serializer.text("2010.3.24");
serializer.endTag("", "p_date");
serializer.endTag("", "paper");


serializer.startTag("", "paper");
// <id>2</id>
serializer.startTag("", "id");
serializer.text("2");
serializer.endTag("", "id");
serializer.startTag("", "cate");
serializer.text("0");
serializer.endTag("", "cate");
serializer.startTag("", "p_name");
serializer.text("10年12月四级");
serializer.endTag("", "p_name");
serializer.startTag("", "p_date");
serializer.text("2010.12.24");
serializer.endTag("", "p_date");
serializer.endTag("", "paper");
// </papers>
serializer.endTag("", "papers");


// <questions number="3″>
serializer.startTag("", "questions");
serializer.attribute("", "number", "3");


serializer.startTag("", "question");
// <id>2</id>
serializer.startTag("", "id");
serializer.text("1");
serializer.endTag("", "id");
serializer.startTag("", "p_id");
serializer.text("0");
serializer.endTag("", "p_id");
serializer.endTag("", "question");


serializer.startTag("", "question");
// <id>2</id>
serializer.startTag("", "id");
serializer.text("2");
serializer.endTag("", "id");
serializer.startTag("", "p_id");
serializer.text("0");
serializer.endTag("", "p_id");
serializer.endTag("", "question");


serializer.startTag("", "question");
// <id>2</id>
serializer.startTag("", "id");
serializer.text("3");
serializer.endTag("", "id");
serializer.startTag("", "p_id");
serializer.text("0");
serializer.endTag("", "p_id");
serializer.endTag("", "question");


// </questions>
serializer.endTag("", "questions");


// </datas>
serializer.endTag("", "datas");
serializer.endDocument();
Log.d(TAG, "writeXml() = " + writer.toString());
return writer.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}


public boolean write(String path, String txt) {
try {
OutputStream os = openFileOutput(path, Context.MODE_PRIVATE);
OutputStreamWriter osw = new OutputStreamWriter(os);
osw.write(txt);
osw.close();
os.close();
} catch (FileNotFoundException e) {
return false;
} catch (IOException e) {
return false;
}
return true;
}


private String readXMLByDOM() {
String re = "123";
DocumentBuilderFactory docBuilderFactory = null;
DocumentBuilder docBuilder = null;
Document doc = null;
try {
docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilder = docBuilderFactory.newDocumentBuilder();
// xml file 放到 assets目录中的
doc = docBuilder.parse(openFileInput("test.xml"));
// root element
Element root = doc.getDocumentElement();
Log.d(TAG, "root_name =  " + root.getNodeName());
getPapers(root);
getQuestions(root);
for (int i = 0; i < papers.size(); i++)
Log.i(TAG, "papers======  " + papers.get(i));
for (int i = 0; i < questions.size(); i++)
Log.i(TAG, "questions======  " + questions.get(i));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
doc = null;
docBuilder = null;
docBuilderFactory = null;
}
// Log.d(TAG, "re = " + re);
return re;
}


public void getPapers(Element root) {
NodeList nodePapersList = root.getElementsByTagName("papers");
Node nodePaper = null;
NodeList nodePaperList = null;
for (int i = 0; i < nodePapersList.getLength(); i++) {
nodePaperList = nodePapersList.item(i).getChildNodes();
for (int j = 0; j < nodePaperList.getLength(); j++) {
nodePaper = nodePaperList.item(j);
papers.add(getPaper(nodePaper));
}
}
}


public PaperItem getPaper(Node nodePaper) {
NodeList nodeItemList = nodePaper.getChildNodes();
PaperItem paper = new PaperItem();
paper._id = Integer.parseInt(nodeItemList.item(0).getTextContent());
paper.cate = Integer.parseInt(nodeItemList.item(1).getTextContent());
paper.p_name = nodeItemList.item(2).getTextContent();
paper.p_date = nodeItemList.item(3).getTextContent();
return paper;
}


public void getQuestions(Element root) {
NodeList nodeQuestionsList = root.getElementsByTagName("questions");
Node nodeQuestion = null;
NodeList nodeQuestionList = null;
for (int i = 0; i < nodeQuestionsList.getLength(); i++) {
nodeQuestionList = nodeQuestionsList.item(i).getChildNodes();
for (int j = 0; j < nodeQuestionList.getLength(); j++) {
nodeQuestion = nodeQuestionList.item(j);
questions.add(getQuestion(nodeQuestion));
}
}
}


public QuestionItem getQuestion(Node nodeQuestion) {
NodeList nodeItemList = nodeQuestion.getChildNodes();
QuestionItem question = new QuestionItem();
question._id = Integer.parseInt(nodeItemList.item(0).getTextContent());
question.p_id = Integer.parseInt(nodeItemList.item(1).getTextContent());
return question;
}


public XmlBean readXMLBySAX() {
SAXParserFactory spf = null;
SAXParser saxParser = null;
try {
spf = SAXParserFactory.newInstance();
saxParser = spf.newSAXParser(); // 创建解析器
// 设置解析器的相关特性,http://xml.org/sax/features/namespaces = true
// 表示开启命名空间特性
// saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
XMLContentHandler handler = new XMLContentHandler();
saxParser.parse(openFileInput("test.xml"), handler);
return handler.getXmlBean();
} catch (Exception e) {
e.printStackTrace();
} finally {
saxParser = null;
spf = null;
}
return null;
}


public class XmlBean {
public List<PaperItem> papers = null;
public int paperNum = 0;
public List<QuestionItem> questions = null;
public int questionNum = 0;
}


public class XMLContentHandler extends DefaultHandler {
private XmlBean xmlBean = null;
// private List<PaperItem> papers = null;
private PaperItem currentPaper;
// private List<QuestionItem> questions = null;
private QuestionItem currentQuestion;
private String tagName = null;// 当前解析的元素标签


private boolean isPaperSax = true;


public XmlBean getXmlBean() {
return xmlBean;
}


/* 接收文档的开始的通知。 */
public void startDocument() throws SAXException {
Log
.d(TAG,
"<<<<<<<<<<<<<<<<<<<<startDocument>>>>>>>>>>>>>>>>>>>>>>>>>>");
xmlBean = new XmlBean();
}


/*
* 接收元素开始的通知。 参数意义如下: namespaceURI:元素的命名空间 localName :元素的本地名称(不带前缀)
* qName :元素的限定名(带前缀) atts :元素的属性集合
*/
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException {


Log.i(TAG, "startElement() --> localName = " + localName
+ "-- qName = " + qName);


if (localName.equals("papers")) {
xmlBean.papers = new ArrayList<PaperItem>();
xmlBean.paperNum = (Integer.parseInt(atts.getValue("number")));
} else if (localName.equals("questions")) {
xmlBean.questions = new ArrayList<QuestionItem>();
xmlBean.questionNum = (Integer
.parseInt(atts.getValue("number")));
} else if (localName.equals("paper")) {
isPaperSax = true;
currentPaper = new PaperItem();
} else if (localName.equals("question")) {
isPaperSax = false;
currentQuestion = new QuestionItem();
}
tagName = localName;
}


/* 接收字符数据的通知。 */
public void characters(char[] ch, int start, int length)
throws SAXException {
Log.v(TAG, "characters() --> tagName = " + tagName + "-- ch = "
+ new String(ch) + "-- start = " + start + "-- length = "
+ length);
if (tagName == null)
return;
String data = new String(ch, start, length);
if (isPaperSax) {
fillPaper(data);
} else {
fillQuestion(data);
}
}


public void fillPaper(String data) {
if (currentPaper == null)
return;
if (tagName.equals("id")) {
currentPaper._id = Integer.parseInt(data);
} else if (tagName.equals("cate")) {
currentPaper.cate = Integer.parseInt(data);
} else if (tagName.equals("p_name")) {
currentPaper.p_name = data;
} else if (tagName.equals("p_date")) {
currentPaper.p_date = data;
}
}


public void fillQuestion(String data) {
if (currentQuestion == null)
return;
if (tagName.equals("id")) {
currentQuestion._id = Integer.parseInt(data);
} else if (tagName.equals("p_id")) {
currentQuestion.p_id = Integer.parseInt(data);
}
}


/* *
* 接收文档的结尾的通知。 参数意义如下: uri :元素的命名空间 localName :元素的本地名称(不带前缀) name
* :元素的限定名(带前缀)
*/
public void endElement(String uri, String localName, String name)
throws SAXException {


Log.i(TAG, "endElement() --> localName = " + localName
+ "-- name = " + name);


if (localName.equals("paper")) {
xmlBean.papers.add(currentPaper);
currentPaper = null;
} else if (localName.equals("question")) {
xmlBean.questions.add(currentQuestion);
currentQuestion = null;
}
tagName = null;
}


public void endDocument() throws SAXException {
Log.d(TAG,
"<<<<<<<<<<<<<<<<<<<<endDocument>>>>>>>>>>>>>>>>>>>>>>>>>> ");
}
}


public XmlBean readXMLByPull() {
XmlBean xmlBean = null;
PaperItem paper = null;
QuestionItem question = null;
boolean isPaper = true;
XmlPullParserFactory xpf = null;
XmlPullParser pullParser = null;
try {
xpf = XmlPullParserFactory.newInstance();
pullParser = xpf.newPullParser(); // 创建解析器
// 设置解析器的相关特性,http://xml.org/sax/features/namespaces = true
// 表示开启命名空间特性
// saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
pullParser.setInput(openFileInput("test.xml"), "UTF-8");
int eventCode = pullParser.getEventType();
while (eventCode != XmlPullParser.END_DOCUMENT) {
Log.i(TAG, "eventCode = " + eventCode);
switch (eventCode) {
case XmlPullParser.START_TAG:
Log.d(TAG, "TagName = " + pullParser.getName());
if ("papers".equals(pullParser.getName())) {
xmlBean.papers = new ArrayList<PaperItem>();
xmlBean.paperNum = (Integer.parseInt(pullParser
.getAttributeValue("", "number")));
} else if ("questions".equals(pullParser.getName())) {
xmlBean.questions = new ArrayList<QuestionItem>();
xmlBean.questionNum = (Integer.parseInt(pullParser
.getAttributeValue("", "number")));
} else if ("paper".equals(pullParser.getName())) {
isPaper = true;
paper = new PaperItem();
} else if ("question".equals(pullParser.getName())) {
isPaper = false;
question = new QuestionItem();
} else if ("id".equals(pullParser.getName())) {
if (isPaper) {
paper._id = Integer.parseInt(pullParser.nextText());
} else {
question._id = Integer.parseInt(pullParser
.nextText());
}
} else if ("cate".equals(pullParser.getName())) {
paper.cate = Integer.parseInt(pullParser.nextText());
} else if ("p_name".equals(pullParser.getName())) {
paper.p_name = pullParser.nextText();
} else if ("p_date".equals(pullParser.getName())) {
paper.p_date = pullParser.nextText();
} else if ("p_id".equals(pullParser.getName())) {
question.p_id = Integer.parseInt(pullParser.nextText());
}


break;


case XmlPullParser.END_TAG:
if ("paper".equals(pullParser.getName())) {
xmlBean.papers.add(paper);
paper = null;
} else if ("question".equals(pullParser.getName())) {
xmlBean.questions.add(question);
question = null;
}
break;


case XmlPullParser.START_DOCUMENT:
xmlBean = new XmlBean();
break;
}
eventCode = pullParser.next();
}


} catch (Exception e) {
e.printStackTrace();
} finally {
pullParser = null;
xpf = null;
}
return xmlBean;
}


public class PaperItem {
public int _id = 0;
public int cate = 0;
public String p_name = "";
public String p_date = "";


public String toString() {
return "_id = " + _id + "-- cate = " + cate + "-- p_name = "
+ p_name + "-- p_date = " + p_date;
}
}


public class QuestionItem {
public int _id = 0;
public int p_id = 0;


public String toString() {
return "_id = " + _id + "-- p_id = " + p_id;
}
}
}


利用方法makeXml()生成的xml存在系统的:/data/data/com.fzh.xml/files/test.xml中,也可以把此文件pull出来到工程的assets目录中,进行引用。