有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。
一、布局界面
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/btn_pull" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginTop="110dp" android:text="@string/btn_pull" /> <Button android:id="@+id/btn_write" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/btn_pull" android:layout_alignRight="@+id/btn_pull" android:layout_below="@+id/btn_pull" android:layout_marginTop="61dp" android:text="@string/btn_write" /> </RelativeLayout>
二、写一个xml文件
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>李明</name> <age>30</age> </person> <person id="20"> <name>李向梅</name> <age>25</age> </person> </persons>
三、写一个和xml相对应的bean
package com.example.lession04_pull.domain; import java.io.Serializable; public class Person implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private int id; private String name; private short age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public short getAge() { return age; } public void setAge(short age) { this.age = age; } public Person(int id, String name, short age) { super(); this.id = id; this.name = name; this.age = age; } public Person() { super(); // TODO Auto-generated constructor stub } }
四、写一个Pul的服务类
package com.example.lession04_pull.service; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import android.os.Environment; import android.util.Xml; import com.example.lession04_pull.domain.Person; public class PullXmlService { public Person currentPerson; public List<Person> readXml(InputStream is){ //声明返回值 List<Person> persons=null; //首先利用Xml.newPullParser()获取解析对象 XmlPullParser xmlPullParser=Xml.newPullParser(); try{ // 解析文件 xmlPullParser.setInput(is, "UTF-8"); //获取解析的事件类型 int eventType=xmlPullParser.getEventType(); //判断文件解析的是否完毕 while(eventType!=XmlPullParser.END_DOCUMENT){ switch (eventType) { case XmlPullParser.START_DOCUMENT: persons=new ArrayList<Person>(); break; case XmlPullParser.START_TAG: String tagName=xmlPullParser.getName(); if("person".equals(tagName)){ //创建person对象 currentPerson=new Person(); currentPerson.setId(Integer.parseInt(xmlPullParser .getAttributeValue(null, "id"))); }else if("name".equals(tagName)){ currentPerson.setName(xmlPullParser.nextText()); }else if("age".equals(tagName)){ currentPerson.setAge(new Short(xmlPullParser.nextText())); } break; case XmlPullParser.END_TAG: if("person".equals(xmlPullParser.getName()) && currentPerson!=null){ //把person对象放到集合中去 persons.add(currentPerson); currentPerson=null; } break; } eventType=xmlPullParser.next(); } is.close(); }catch(Exception e){ e.printStackTrace(); } return persons; } // 写入 public boolean write(List<Person> persons) { // 采用pull解析进行实现 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 获取sdcard目录 文件对象 File sdCardDir = Environment.getExternalStorageDirectory(); // 创建文件 File file = new File(sdCardDir, "mycsdn.xml"); XmlSerializer serializer = Xml.newSerializer(); FileOutputStream fos = null; try { // 根据文件对象创建一个文件的输出流对象 fos = new FileOutputStream(file); // 设置输出的流及编码 serializer.setOutput(fos, "UTF-8"); // 设置文件的开始 serializer.startDocument("UTF-8", true); // persons标签开始 serializer.startTag(null, "persons"); for (Person person : persons) { // person标签的开始 serializer.startTag(null, "person"); // 设置person标签的属性 serializer.attribute("null", "id", person.getId() + ""); // 设置person标签的子标签 name serializer.startTag(null, "name"); serializer.text(person.getName()); serializer.endTag(null, "name"); // 设置person标签的子标签的age serializer.startTag(null, "age"); serializer.text(person.getAge() + ""); serializer.endTag(null, "age"); // person标签的结束 serializer.endTag(null, "person"); } // persons标签的结束 serializer.endTag(null, "persons"); // 文件的结束 serializer.endDocument(); fos.flush(); fos.close(); return true; } catch (Exception e) { e.printStackTrace(); } } return false; } }
五、在MainActivity中调用测试
package com.example.lession04_pull; import java.util.List; import com.example.lession04_pull.domain.Person; import com.example.lession04_pull.service.PullXmlService; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { public Button btn_pull,btn_write; public PullXmlService pullXmlService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化 pullXmlService=new PullXmlService(); btn_pull=(Button) findViewById(R.id.btn_pull); btn_write=(Button) findViewById(R.id.btn_write); btn_pull.setOnClickListener(new MyOnClickListener()); btn_write.setOnClickListener(new MyOnClickListener()); } @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; } class MyOnClickListener implements View.OnClickListener{ @Override public void onClick(View v) { int id=v.getId(); switch (id) { case R.id.btn_pull: List<Person> persons=null; try{ persons=pullXmlService.readXml(getAssets().open("csdn.xml")); }catch(Exception e){ e.printStackTrace(); } if(persons!=null){ Toast.makeText(MainActivity.this, "采用pull解析xml文件"+persons.get(0).getName()+"--"+persons.get(1).getName(), Toast.LENGTH_LONG).show(); } break; case R.id.btn_write: try{ List<Person> pers=pullXmlService.readXml(getAssets().open("csdn.xml")); //重新生成一个xml文件 mysdcare.xml boolean flag=pullXmlService.write(pers); if(flag){ Toast.makeText(MainActivity.this, "采用pull解析生产xml文件成功", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(MainActivity.this, "采用pull解析生产xml文件失败", Toast.LENGTH_LONG).show(); } }catch(Exception e){ e.printStackTrace(); } break; } } } }