您的位置:首页 > 移动开发 > Android开发

android中pull解析xml文件

2015-03-26 00:15 204 查看
在android系统中,很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样(个人感觉要比sax简单点),也是采用事件驱动进行解析的,当pull解析器,开始解析之后,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。

以下是我们想要把对象进行序列化,得到如下格式的xml文件,命名为person.xml:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<persons>
<person id="0">
<name>wang0</name>
<age>18</age>
</person>
<person id="1">
<name>wang1</name>
<age>19</age>
</person>
<person id="2">
<name>wang2</name>
<age>20</age>
</person>
<person id="3">
<name>wang3</name>
<age>21</age>
</person>
</persons>
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。我们定义一个类Person类,用来表示xml文件中对应内容:

public class Person {

private int id;
private String name;
private int age;
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
下面我们使用Pull解析器生成XML文件:
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
writeXmlToLocal();
}

@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;
}

private List<Person> getPersonList() {
List<Person> personList = new ArrayList<Person>();

for (int i = 0; i < 4; i++) {
personList.add(new Person(i, "wang" + i, 18 + i));
}

return personList;
}
/**
* 写xml文件到本地
*/
private void writeXmlToLocal() {
List<Person> personList = getPersonList();

// 获得序列化对象
XmlSerializer serializer = Xml.newSerializer();

try {

//File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
File path = new File("/data/data/com.founder.xmldemo/", "persons.xml");
FileOutputStream fos = new FileOutputStream(path);
// 指定序列化对象输出的位置和编码
serializer.setOutput(fos, "utf-8");

serializer.startDocument("utf-8", true);	// 写开始 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>

serializer.startTag(null, "persons");		// <persons>

for (Person person : personList) {
// 开始写人

serializer.startTag(null, "person");	// <person>
serializer.attribute(null, "id", String.valueOf(person.getId()));

// 写名字
serializer.startTag(null, "name");		// <name>
serializer.text(person.getName());
serializer.endTag(null, "name");		// </name>

// 写年龄
serializer.startTag(null, "age");		// <age>
serializer.text(String.valueOf(person.getAge()));
serializer.endTag(null, "age");		// </age>

serializer.endTag(null, "person");	// </person>
}

serializer.endTag(null, "persons");			// </persons>

serializer.endDocument();		// 结束
} catch (Exception e) {
e.printStackTrace();
}

}
}
运行程序,这样我们就可以在/data/data/com.founder.xmldemo/目录下找到存储的xml文件。

接下来我们可以使用pull解析刚刚生成的XML文件,写下如下代码:

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<Person> personList = parserXmlFromLocal();
for (Person person : personList) {
Log.i("TestCase", person.toString());
}
}
@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;
}

/**
* 对sd卡中的xml文件进行pull解析
* @return
*/
private List<Person> parserXmlFromLocal() {
try {
File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
FileInputStream fis = new FileInputStream(path);

// 获得pull解析器对象
XmlPullParser parser = Xml.newPullParser();
// 指定解析的文件和编码格式
parser.setInput(fis, "utf-8");
int eventType = parser.getEventType(); // 获得事件类型
List<Person> personList = null;
Person person = null;
String id;
while(eventType != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName(); // 获得当前节点的名称
switch (eventType) {
case XmlPullParser.START_TAG: // 当前等于开始节点 <person>
if("persons".equals(tagName)) { // <persons>
personList = new ArrayList<Person>();
} else if("person".equals(tagName)) { // <person id="1">
person = new Person();
id = parser.getAttributeValue(null, "id");
person.setId(Integer.valueOf(id));
} else if("name".equals(tagName)) { // <name>
person.setName(parser.nextText());
} else if("age".equals(tagName)) { // <age>
person.setAge(Integer.parseInt(parser.nextText()));
}
break;
case XmlPullParser.END_TAG: // </persons>
if("person".equals(tagName)) {
// 需要把上面设置好值的person对象添加到集合中
personList.add(person);
}
break;
default:
break;
}
eventType = parser.next(); // 获得下一个事件类型
}
return personList;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

通过以上方法我们就可以把xml文件解析出来了

是不是很简单呢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pull xml