Android 生成和Pull解析xml

一、单个对象生成xml

生成以下xml,该怎么生成呢?

1
2
3
4
5
6
7
<?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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/**
 * 单个对象生成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

1
2
3
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解析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
 * 解析单个对象组成的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组

类似这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
 * 生成单个对象的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");
    }
}

简单地用几行代码生成

1
2
3
4
5
6
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组 基础上修改一点就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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>

修改地方为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            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部分解析即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
                // 如果遇到了开始标签
                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);
                        }
                    }
                }

本文原创链接:http://www.cnblogs.com/liqw/p/4267461.html

下载地址:http://download.csdn.net/detail/lqw770737185/8417583

posted @ 2016-12-30 12:40  天涯海角路  阅读(163)  评论(0)    收藏  举报