編輯:關於Android編程
這篇博客主要用來介紹對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 loadPersons(InputStream in) throws Exception{
XmlPullParser parser = Xml.newPullParser();//獲取解析器
parser.setInput(in,UTF-8);//指定輸入流、碼表
ArrayList persons = new ArrayList();
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 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 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
范冰冰 31林志玲 38楊冪 26
Android Context上下文理解
Android中有個我們熟悉又陌生的對象Context(上下文),當我們啟動Activity的時候需要上下文,當我們使用dialog的時候我們需要上下文,但是上下文對象到
android 調用系統方法獲取應用程序信息 如緩存大小
1,android本來就有獲取應用緩存的方法,只是用起來有點麻煩。但我們的應用有時需要讓用戶知道緩存的大小,讓用戶及時清理緩存。直接上代碼,demo使用android s
Android 中使用代碼動態布局
Android 中使用代碼動態布局 本文介紹在android中使用代碼動態布局,有時候根據不同的需求,比如需要根據服務器上的條目個數來決定app中頁面布局控件(
android截屏功能實現代碼
android開發中通過View的getDrawingCache方法可以達到截屏的目的,只是缺少狀態欄!原始界面截屏得到的圖片代碼實現1. 添加權限(AndroidMan