这篇博客主要用来介绍对XML文件的操作:解析与生成。
Android手机内部的解析就是pull解析
官网:http://xmlpull.org/
所谓的解析,我们可以理解为:利用XML文件的内容来生成一个对象
导出生成的xml文件后不要对其格式化,否则会出异常
1、MainActivity
package com.example.xmlparsertest1; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
2、Person
package com.example.xmlparsertest1; public class Person { private Integer id; private String name; private Integer age; public Person() { // TODO Auto-generated constructor stub } public Person(Integer id, String name, Integer age) { super(); this.id = id; this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
3、PersonService
package com.example.xmlparsertest1; 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.Xml; public class PersonService { /** * 解析XML文件 * @param in * @return * @throws Exception */ public List<Person> loadPersons(InputStream in) throws Exception{ XmlPullParser parser = Xml.newPullParser();//获取解析器 parser.setInput(in,"UTF-8");//指定输入流、码表 ArrayList<Person> persons = new ArrayList<Person>(); Person p = null; /** * parser.getName():获取标签的名字 * parser.getAttributeValue(0): 获取某个属性的值 * parser.next(): 让指针指向下一个标签 * parser.nextText(): 获取某个标签的文本内容 */ for(int type = parser.getEventType() ; type != XmlPullParser.END_DOCUMENT ; type = parser.next()){ if(type == XmlPullParser.START_TAG){ if(parser.getName().equals("person")){ p = new Person(); String id = parser.getAttributeValue(0);//获取该标签的第0个属性的值(value) // String id = parser.getAttributeValue(null, "id");//这样写也行。第一个参数是命名空间,第二个参数是属性的名字 p.setId(Integer.parseInt(id)); persons.add(p); }else if(parser.getName().equals("name")){ String name = parser.nextText(); p.setName(name); }else if(parser.getName().equals("age")){ String age = parser.nextText(); p.setAge(Integer.parseInt(age)); } } } return persons; } //生成XML文件 public void savePersons(List<Person> persons,OutputStream out)throws Exception{ XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(out,"UTF-8"); serializer.startDocument("UTF-8", true);//开始文档 serializer.startTag(null, "persons");//开始标签 /** * serializer.startDocument("UTF-8", true);//开始文档 * serializer.startTag(null, "persons");//开始标签 * serializer.attribute(null, "id", p.getId().toString());//设置属性 * serializer.text(p.getName());//设置标签的文本内容 * serializer.endTag(null, "persons"); * serializer.endDocument(); */ for(Person p : persons){ serializer.startTag(null, "person"); serializer.attribute(null, "id", p.getId().toString());//设置属性 serializer.startTag(null, "name"); serializer.text(p.getName());//设置标签的文本内容 serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(p.getAge().toString()); serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); } }
4、PersonServiceTest
package com.example.xmlparsertest1; import java.io.FileOutputStream; import java.io.InputStream; import java.util.List; import android.os.Environment; import android.test.AndroidTestCase; public class PersonServiceTest extends AndroidTestCase { public void testXMLParser() throws Exception{ PersonService service = new PersonService(); //获取src目录下的资源为输入流方法 InputStream in = PersonServiceTest.class.getClassLoader().getResourceAsStream("persons_hjd.xml"); List<Person> persons = service.loadPersons(in); for(Person p : persons){ System.out.println( "----------->" + p); } // Person p = new Person(4, "hjd", 22); // persons.add(p); // // service.savePersons(persons, new FileOutputStream(Environment.getExternalStorageDirectory() + "/" + "persons_hjd.xml")); } }
以下附上需要解析的XML文件:persons.xml
<?xml version=‘1.0‘ encoding=‘UTF-8‘ standalone=‘yes‘ ?> <persons> <person id="1"> <name>范冰冰</name> <age>31</age> </person> <person id="2"> <name>林志玲</name> <age>38</age> </person> <person id="3"> <name>杨幂</name> <age>26</age> </person> </persons>
源码下载:http://download.csdn.net/detail/caihongshijie6/7616863