• Android:读取assets目录下文件(二)


    在上篇博客里,介绍了如何读取assets目录下的txt文件。在这里,介绍如何读取xml文件。

    xml文件内容如下:

    <?xml version="1.0" encoding="UTF-8"?> 
    <books> 
       <book id="001"> 
          <title>Harry Potter</title> 
          <price>¥35.00</price> 
       </book> 
       <book id="002"> 
          <title>Learning XML</title> 
          <price>¥66.00</price> 
       </book> 
       <book id="003"> 
          <title>Thinking in Java</title> 
          <price>¥1.00</price> 
       </book> 
       <book id="004"> 
          <title>Useful Android</title> 
          <price>¥1.50</price> 
       </book> 
    </books> 

    根据xml文件,接下来定义一个Book类,有id, title, price三个属性。

    然后使用一个子线程,通过AssetManager读取到数据流,再使用XmlPullParser解析xml文件。

    完整示例代码如下:

    package com.li.readassetfile;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    
    import android.app.Activity;
    import android.content.res.AssetManager;
    import android.content.res.XmlResourceParser;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.Xml;
    import android.widget.TextView;
    
    public class ReadXmlActivity extends Activity {
    
        private TextView tvContent;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_read_xml);
    
            tvContent = (TextView) findViewById(R.id.tvContent);
    
            new Handler().post(new Runnable() {
    
                @Override
                public void run() {
                    AssetManager manager = getResources().getAssets();
                    List<Book> books = null;  
                    Book book = null;
    
                    try {
                        InputStream inputStream = manager.open("book.xml");  
                        XmlPullParser parser = Xml.newPullParser();  
                        parser.setInput(inputStream, "UTF-8"); 
    
                        StringBuilder sb = new StringBuilder();
    
                        try {
                            while(parser.getEventType() != XmlPullParser.END_DOCUMENT){
                                if(parser.getEventType() == XmlPullParser.START_DOCUMENT){
    
                                    books = new ArrayList<ReadXmlActivity.Book>();
    
                                }else if(parser.getEventType() == XmlPullParser.START_TAG){
    
                                    if("book".equals(parser.getName())){
                                        book = new Book();
                                        book.setId(parser.getAttributeValue(0));
                                    }
    
                                    if(book!=null){  
                                        if("title".equals(parser.getName())){//判断开始标签元素是否是name  
                                            book.setTitle(parser.nextText());  
                                        }else if("price".equals(parser.getName())){//判断开始标签元素是否是price  
                                            book.setPrice(parser.nextText());  
                                        }  
                                    }  
    
                                }else if(parser.getEventType() == XmlPullParser.END_TAG){
                                    if("book".equals(parser.getName())){//判断结束标签元素是否是book  
                                        books.add(book);//将book添加到books集合  
                                        book = null;  
                                    }  
                                }
                                parser.next();
                            }
    
                            if(books != null && books.size() > 0){                          
                                for(int i = 0; i < books.size(); i ++){
                                    sb.append(books.get(i).getId() + "");
                                    sb.append(books.get(i).getTitle() + "");
                                    sb.append(books.get(i).getPrice() + "");
                                    sb.append("
    ");
                                }
                            }
    
                            inputStream.close();
                            tvContent.setText(sb.toString());
                        } catch (XmlPullParserException e) {
                            e.printStackTrace();
                        }
                    } catch (IOException | XmlPullParserException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        private class Book{
    
            private String id;
            private String title;
            private String price;
    
            public String getId() {
                return id;
            }
            public void setId(String id) {
                this.id = id;
            }
            public String getTitle() {
                return title;
            }
            public void setTitle(String title) {
                this.title = title;
            }
            public String getPrice() {
                return price;
            }
            public void setPrice(String price) {
                this.price = price;
            }
        }
    }
    

    使用完,要注意关闭数据流。为了防止ANR,所以这里使用子线程来读取xml文件。

  • 相关阅读:
    sentinel.conf样例
    哨兵模式java实例
    哨兵模式启动redis
    华为笔试:直角三角形个数
    leetcode 337. 打家劫舍iii
    leetcode 494. 目标数
    leetcode 394. 字符串解码
    leetcode 128. 最长连续子序列
    链表快排
    leetcode 877. 石子游戏
  • 原文地址:https://www.cnblogs.com/lishbo/p/9956021.html
Copyright © 2020-2023  润新知