一、單個對象生成xml
生成以下xml,該怎麼生成呢?
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<account>
<id>1</id>
<password>123456</password>
<name>傳說之美</name>
<createDate>2015-02-02 11:50:42</createDate>
</account>
先定義一個account類,屬性有id、name、password、createDate。
public class Account {
private String id;
private String password;
private String name;
private String createDate;
public Account() {
super();
}
public Account(String id, String password, String name, String createDate) {
super();
this.id = id;
this.password = password;
this.name = name;
this.createDate = createDate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
@Override
public String toString() {
return "Account [id=" + id + ", password=" + password + ", name=" + name + ", createDate=" + createDate + "]\n\n";
}
}
定義好這個類,就可以利用XmlSerializer用於寫xml數據了。寫個方法,把生成的xml保存在xmlparser_account.xml文件。
/**
* 單個對象生成xml
* @param account
*/
private static void XmlFileCreator(Account account) {
File newxmlfile = new File(Environment.getExternalStorageDirectory() + "/xmlparser_account.xml");
try {
if (!newxmlfile.exists())
newxmlfile.createNewFile();
} catch (IOException e) {
Log.e("IOException", "exception in createNewFile() method");
}
FileOutputStream fileos = null;
try {
fileos = new FileOutputStream(newxmlfile);
} catch (FileNotFoundException e) {
Log.e("FileNotFoundException", "can't create FileOutputStream");
}
// XmlSerializer用於寫xml數據
XmlSerializer serializer = Xml.newSerializer();
try {
// XmlSerializer 用 UTF-8 編碼
serializer.setOutput(fileos, "UTF-8");
serializer.startDocument(null, Boolean.valueOf(true));
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
serializer.startTag(null, "account");
// xml-tree,由startTag開始,endTag結束
serializer.startTag(null, "id");
serializer.text(account.getId());
serializer.endTag(null, "id");
serializer.startTag(null, "password");
serializer.text(account.getPassword());
serializer.endTag(null, "password");
serializer.startTag(null, "name");
serializer.text(account.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "createDate");
serializer.text(account.getCreateDate());
serializer.endTag(null, "createDate");
serializer.endTag(null, "account");
serializer.endDocument();
// 寫xml數據到FileOutputStream
serializer.flush();
// 關閉fileos,釋放資源
fileos.close();
} catch (Exception e) {
Log.e("Exception", "error occurred while creating xml file");
}
}
生成account對象,單個對象生成xml
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Account account = new Account("1", "123456", "傳說之美", sdf.format(new Date()));
XmlFileCreator(account);
查看保存的文件
二、解析單個對象組成的xml為單個對象
把生成的xmlparser_account.xml文件放在res/xml/下,將這個xml解析為Account對象。這裡用XmlResourceParser,XmlResourceParser繼承了xmlpullparse的類。
Pull解析和sax解析類似,都采用事件驅動進行解析的,當pull解析器,開始解析後,調用它的next()方法,獲取下一個解析事件(包括4個解析事件:開始文檔,結束文檔,開始標簽,結束標簽),這裡單單說一下Pull解析。
/**
* 解析單個對象組成的xml和xml組
* @return
*/
private List<Account> getListData() {
List<Account> accountList = new ArrayList<Account>();
XmlResourceParser xrp = getResources().getXml(R.xml.xmlparser_account);
try {
// 直到文檔的結尾處
Account account = null;
while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {
String tagName = xrp.getName();
if (xrp.getEventType() == XmlResourceParser.START_DOCUMENT){
}
// 如果遇到了開始標簽
if (xrp.getEventType() == XmlResourceParser.START_TAG) {
Log.i("", tagName);
if(tagName.equals("account")){
account = new Account();
} else if (account != null) {
if (tagName.equals("id")) {
String id = xrp.nextText();// 通過屬性名來獲取屬性值
account.setId(id);
} else if (tagName.equals("password")) {
String password = xrp.nextText();// 通過屬性索引來獲取屬性值
account.setPassword(password);
} else if (tagName.equals("name")) {
String name = xrp.nextText();
account.setName(name);
} else if (tagName.equals("createDate")) {
String createDate = xrp.nextText();
account.setCreateDate(createDate);
}
}
}
if (xrp.getEventType() == XmlResourceParser.END_TAG) {
if (tagName.equals("account") && account !=null) {
accountList.add(account);
account = null;
}
}
xrp.next();// 獲取解析下一個事件
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return accountList;
}
直接打印結果看看
1
Log.i("", getListData().toString());
log如下
三、單個對象組成的xml組
類似這樣
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<accounts>
<account>
<id>2</id>
<password>123456</password>
<name>傳說</name>
<createDate>2015-02-02 02:54:41</createDate>
</account>
<account>
<id>3</id>
<password>567890</password>
<name>之美</name>
<createDate>2015-02-02 02:54:41</createDate>
</account>
</accounts>
生成單個對象組 組成的xml組跟單個對象xml基本差不多,寫成了一個方法,把生成的xml保存在xmlparser_accounts.xml文件。
/**
* 生成單個對象的xml數組
*
* @param data
*/
private static void XmlFileCreator(List<Account> data) {
File newxmlfile = new File(Environment.getExternalStorageDirectory() + "/xmlparser_accounts.xml");
try {
if (!newxmlfile.exists())
newxmlfile.createNewFile();
} catch (IOException e) {
Log.e("IOException", "exception in createNewFile() method");
}
FileOutputStream fileos = null;
try {
fileos = new FileOutputStream(newxmlfile);
} catch (FileNotFoundException e) {
Log.e("FileNotFoundException", "can't create FileOutputStream");
}
XmlSerializer serializer = Xml.newSerializer();
try {
serializer.setOutput(fileos, "UTF-8");
serializer.startDocument(null, Boolean.valueOf(true));
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
serializer.startTag(null, "accounts");
for (Account account : data) {
serializer.startTag(null, "account");
serializer.startTag(null, "id");
serializer.text(account.getId());
serializer.endTag(null, "id");
serializer.startTag(null, "password");
serializer.text(account.getPassword());
serializer.endTag(null, "password");
serializer.startTag(null, "name");
serializer.text(account.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "createDate");
serializer.text(account.getCreateDate());
serializer.endTag(null, "createDate");
serializer.endTag(null, "account");
}
serializer.endTag(null, "accounts");
serializer.endDocument();
serializer.flush();
fileos.close();
} catch (Exception e) {
Log.e("Exception", "error occurred while creating xml file");
}
}
簡單地用幾行代碼生成
Account account1 = new Account("2", "123456", "傳說", sdf.format(new Date()));
Account account2 = new Account("3", "567890", "之美", sdf.format(new Date()));
List<Account> accountList = new ArrayList<Account>();
accountList.add(account1);
accountList.add(account2);
XmlFileCreator(accountList);
生成的文件如下
四、解析單個對象組成的xml組
跟 二、解析單個對象組成的xml為單個對象 一樣 ,請查看二
五、生成具有attribute的單個對象組成的xml組
類似如下,account裡面還包含一個attribute值如何生成,其實很簡單,在 三、單個對象組成的xml組 基礎上修改一點就可以了
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<accounts>
<account id="2">
<password>123456</password>
<name>傳說</name>
<createDate>2015-02-02 04:50:45</createDate>
</account>
<account id="3">
<password>567890</password>
<name>之美</name>
<createDate>2015-02-02 04:50:45</createDate>
</account>
</accounts>
修改地方為
for (Account account : data) {
serializer.startTag(null, "account");
serializer.attribute(null, "id", account.getId());
// serializer.startTag(null, "id");
// serializer.text(account.getId());
// serializer.endTag(null, "id");
serializer.startTag(null, "password");
serializer.text(account.getPassword());
serializer.endTag(null, "password");
serializer.startTag(null, "name");
serializer.text(account.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "createDate");
serializer.text(account.getCreateDate());
serializer.endTag(null, "createDate");
serializer.endTag(null, "account");
}
六、解析具有attribute的單個對象組成的xml組
解析同理,跟四、解析單個對象組成的xml組 差不多,修改id部分解析即可
// 如果遇到了開始標簽
if (xrp.getEventType() == XmlResourceParser.START_TAG) {
Log.i("", tagName);
if(tagName.equals("account")){
account = new Account();
String id = xrp.getAttributeValue(null, "id");
account.setId(id);
} else if (account != null) {
if (tagName.equals("id")) {
// String id = xrp.nextText();
// account.setId(id);
} else if (tagName.equals("password")) {
String password = xrp.nextText();
account.setPassword(password);
} else if (tagName.equals("name")) {
String name = xrp.nextText();
account.setName(name);
} else if (tagName.equals("createDate")) {
String createDate = xrp.nextText();
account.setCreateDate(createDate);
}
}
}