import org.xmlpull.v1.XmlPullParser;//包含解析XML文件类的包import org.xmlpull.v1.XmlPullParserException;//处理异常importorg.xmlpull.v1.XmlSerializer;//包含写入XML文件类的包我们以SQLite数据库课堂练习中的数据类People为例,People类有4个属性:ID,Name,Age,Height,假设有一条测试数据ID=1,Name=”杜甫”,Age=30,Height=1.75,
<peopleinfo><peopletag="item1"><id>1</id><name>杜甫</name><age>30</age><height>1.75</height></people></peopleinfo>1. 使用XmlPullParser对该文件解析
XmlPullParser parser= getResources().getXml(R.xml.peopleinfo);XmlPullParser的相关函数及说明如下:
相关函数或变量 | 说明 | 示例 |
XmlPullParser.START_DOCUMENT | 文档开始标识,根元素 | <peopleinfo> |
XmlPullParser.END_DOCUMENT | 文档结束标识 | </peopleinfo> |
XmlPullParser.START_TAG | 元素开始标识 | <people> |
XmlPullParser.END_TAG | 元素结束标识 | </people> |
getEventType() | 获取当元素的类型 (如START_TAG, END_TAG, TEXT, etc.) | 如<peopleinfo> 的类型为START_DOCUMENT |
next() | 获取下一个待解析元素 | 事件表示<>括号中的一个项 |
getName() | 获取当前元素的名字 | 如读取到<age>,返回值为”age” |
nextText() | 返回当前元素所对应的文本值 | 如事件为<height>时,返回1.75 |
getAttributeName(int index) | 获取当前元素中属性名 | 如tag |
getAttributeValue(int index) | 获取当前元素中属性的值 | 如"item1" |
XmlSerializer serializer = Xml.newSerializer();serializer.setOutput(writer);//…writer.flush()XmlSerializer的相关函数及说明如下:
相关函数 | 说明 | 示例 |
setOutput(Writer writer) | 设置输出的Writer对象 | |
startDocument(String encoding, Boolean standalone); | 写入XML文件的起始标识语句,必须在setOutput后被调用 | <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> |
startTag(String namespace, String name); | 写入开始元素标识 | 如<people>,<age> |
attribute(String namespace, String name, String value); | | 如tag=”people1” |
text(String text) | 写入元素值 | 如:杜甫 |
endTag(String namespace, String name) | 写入元素结束标识 | 如</people>,</age> |
endDocument(); | 写入文档结束标记 | |
package aaron.android.SQLiteDamon;import java.io.IOException;import java.io.Writer;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlSerializer;import android.util.Log;public class XmlPullHelper {private XmlPullParser parser;private XmlSerializer serializer;private ArrayList<Map<String, Object>> contents=new ArrayList<Map<String,Object>>();private Map<String,Object> map=null;public XmlPullHelper(XmlPullParser parser,XmlSerializer serial){this.parser=parser;this.serializer = serial;}/** * 将xml文件中的所有节点的数据解析后保存在一个ArrayList中返回 * @param nodeName:数据项的名称,这里为"people" * @param attr:数据项的属性,如id,name,age,height * @return 解析该xml文件数据的结果 * @throws XmlPullParserException * @throws IOException */public ArrayList<Map<String,Object>> xmlPull(String nodeName,String[] attr) throws XmlPullParserException, IOException{//循环读取所有的元素while(parser.next()!=XmlPullParser.END_DOCUMENT){switch(parser.getEventType()){case XmlPullParser.START_DOCUMENT:break;case XmlPullParser.START_TAG:{//元素开始标识//判断是否为所需要的数据项,如果是,在初始化一个map用于保存该数据项的值if(parser.getName()!=null&&parser.getName().equals(nodeName)){map=new HashMap<String, Object>();//循环读取该元素中所有的属性for(int j=0;j<parser.getAttributeCount();j++)map.put(parser.getAttributeName(j), parser.getAttributeValue(j));//添加属性的值,如tag="item1"}else if(map!=null){for(int i=0;i<attr.length;i++){if(parser.getName()!=null&&parser.getName().equals(attr[i])){//添加子元素的值,如<name>张三</name>map.put(attr[i],parser.nextText());}}}break;}case XmlPullParser.END_TAG: {//元素结尾标识//判断是否为一个数据项的结束,如果是,将该数据项的数据添加到数据集contents中if(parser.getName().equals(nodeName)&&map!=null){contents.add(map);map=null;}break;}}}return contents;}/** * 将给定的数据集写入XML文件 * @param fileName: 根元素名,默认设为跟文件名相同,如"peopleinfo" * @param nodeName: 数据项名 如"people" * @param attr: 数据项的属性 如id,name,age,height * @param con: 待写入的数据集 * @throws XmlPullParserException * @throws IOException */public void xmlWrite(String fileName,String nodeName,String[] attr,ArrayList<Map<String,Object>> con) throws XmlPullParserException, IOException{serializer.startDocument("UTF-8", true);serializer.startTag(null, fileName);//开始根元素标签<peopleinfo>for(int i=0;i<con.size();i++){//开始元素标签<people>serializer.startTag(null, nodeName);//标签people属性serializer.attribute(null, "tag", "people"+i);//循环将子节点写入元素id,name,age,heightfor(int j=0;j<attr.length;j++){serializer.startTag(null, attr[j]);serializer.text(con.get(i).get(attr[j]).toString());serializer.endTag(null, attr[j]);}//结束标签</people>serializer.endTag(null, nodeName);}//结束标签</peopleinfo>serializer.endTag(null, fileName);//结束文档标记serializer.endDocument();}}1. 使用该工具类XmlPullHelper具体实现
//定义数据集对象contents用于保存从XML文件中读取的数据ArrayList<Map<String, Object>> contents = null;//将数据写入XML文件,并保存到SD卡中if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录File saveFile = new File(sdCardDir, "peopleinfo.xml");FileWriter w=new FileWriter(saveFile);XmlSerializer serializer = Xml.newSerializer();XmlPullHelper xHelper=new XmlPullHelper(null,serializer);//待写入的子元素标签String []items={"id","name","age","height"};//将Writer对象传递给 serializerserializer.setOutput(w);xHelper.xmlWrite("peopleinfo", "people", items, contents);//调用写入方法w.flush(); //将serializer中数据写入文件w.close();}//读XML文件,解析并保存在数据集contentsXmlPullParser parser = getResources().getXml(R.xml.peopleinfo);XmlPullHelper xHelper=new XmlPullHelper(parser,null);String []items={"id","name","age","height"};try{contents=xHelper.xmlPull("people", items);//调用解析方法}catch(Exception e){Log.e("XmlPullParser",e.getMessage(),e);}Android SDK内置了Pull解释器,使用XmlPullParser比较方便,解析XML文件的技术还有很多种,如 SAX和DOM,还需要更多的学习。