11.Android-Xml读写
android中写XML时,需要用到XmlSerializer类
解析XML时,则需要用到XmlPullParser类
1.XmlSerializer类介绍
通过Xml.newSerializer()来获取XmlSerializer
XmlSerializer常用方法如下所示:
void setOutput(OutputStream os, String encoding); //设置要写入的XML的文件位置,以及encoding编码格式 //比如: //File file = new File(Environment.getExternalStorageDirectory(), "text.xml"); //xmlSerializer.setOutput(new fileOutputStream(file), "utf-8"); void startDocument(String encoding, Boolean standalone); //设置文档开头描述,比如:" <?xml version="1.0" encoding="utf-8" standalone="yes"?>" // standalone:表示该XML是否是独立的,默认为true,如果填为false,则表示该XML被外部文件DTD约束 startTag(String namespace, String name); //写入开始元素标签 endTag(String namespace, String name); //写入结束元素标签 attribute(String namespace, String name, String value); //往元素标签里写属性(name="value"),比如<name id="123">
text(String text); //往元素里添加内容,比如: <name id="123">张三</name>
示例代码如下:
private void writePersonXml(){ XmlSerializer serializer = Xml.newSerializer(); try { serializer.setOutput(openFileOutput("persons.xml", MODE_PRIVATE), "utf-8"); serializer.startDocument("utf-8", true); serializer.startTag(null,"persons"); //创建两个成员 serializer.startTag(null,"person"); serializer.attribute(null, "id", "1"); //添加编号 serializer.startTag(null,"姓名"); serializer.text("张三"); serializer.endTag(null,"姓名"); serializer.startTag(null,"age"); serializer.text("17"); serializer.endTag(null,"age"); serializer.endTag(null,"person"); serializer.startTag(null,"person"); serializer.attribute(null, "id", "2"); //添加编号 serializer.startTag(null,"姓名"); serializer.text("李四"); serializer.endTag(null,"姓名"); serializer.startTag(null,"age"); serializer.text("19"); serializer.endTag(null,"age"); serializer.endTag(null,"person"); serializer.endTag(null,"persons"); serializer.endDocument(); //结束文档,并将内容写入文件 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
运行后,生成persons.xml:
接下来,我们便通过XmlPullParser来解析persons.xml
2.XmlPullParser介绍
通过Xml. newPullParser()来获取XmlPullParser;
XmlPullParser常用方法如下:
void setInput(InputStream inputStream, String inputEncoding); //设置要解析的文件以及编码 int getEventType(); //获取当前事件类型,返回的类型有START_DOCUMENT(文档开头)、START_TAG (元素开头)、END_TAG(元素结束)、TEXT (内容)、 END_DOCUMENT(文档结束) int next(); //获取下个事件类型. 返回的类型和getEventType()一样. getName(); //获取当前元素名 getTextCharacters(); //获取当前内容(当getEventType ()==TEXT时通过这个来获取元素内容) nextText(); //获取下个内容(当getEventType ()==START_TAG时通过这个来获取元素内容)
示例代码如下:
private void parsePersonsXml(){ XmlPullParser pullParser = Xml.newPullParser(); try { pullParser.setInput(this.openFileInput("persons.xml"), "utf-8"); String name = null; String age = null; String id = null; int eventType = pullParser.getEventType(); while(eventType!=pullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: if("person".equals( pullParser.getName())){ id = pullParser.getAttributeValue(null, "id"); //获取编号,并初始化内容 name =null; age = null; }else if("姓名".equals(pullParser.getName())){ name = pullParser.nextText(); //获取姓名 }else if("age".equals(pullParser.getName())){ age = pullParser.nextText(); //获取年龄 } break; case XmlPullParser.END_TAG: if("person".equals( pullParser.getName())){ System.out.println("person : id="+id+" 姓名="+name+" 年龄="+age); //打印信息 } break; } eventType = pullParser.next(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
运行打印:
人间有真情,人间有真爱。