• Android解析XML(PULL方式)和JSON 工作原理和实现过程(详细代码)


    Json:解析过程和解析原理以及与XML的对比(这里讲的挺详细的:http://blog.csdn.net/onlyonecoder/article/details/8490924

     

    PULL 的工作原理:

    XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parsernextTextXML文档中提取所有字符数据。当解析到一个文档结束时,自动生成EndDocument事件。

     

    常用的XML pull的接口和类:

    XmlPullParser该解析器是一个在org.xmlpull.v1中定义的解析功能的接口。

    XmlSerializer它是一个接口,定义了XML信息集的序列。

    XmlPullParserFactory这个类用于在XMPULL V1 API中创建XML Pull解析器。

    XmlPullParserException抛出单一的XML pull解析器相关的错误。

     

     

     

    PULL解析器的运行方式和SAX类似,都是基于事件的模式。

    不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码:

    读取到xml声明返回 START_DOCUMENT; 结束返回 END_DOCUMENT ; 开始标签返回 START_TAG;

    结束标签返回 END_TAG; 文本返回 TEXT。

     

    发个图先:


     

    Book.xml

     

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <books>
     3     <book>
     4         <id>1</id>
     5         <name>Android开发范例大全(第一版)</name>
     6         <price>69.00</price>
     7     </book>
     8     <book>
     9         <id>2</id>
    10         <name>Android开发范例大全(第二版)</name>
    11         <price>79.00</price>
    12     </book>
    13     <book>
    14         <id>3</id>
    15         <name>Android开发范例大全(第三版)</name>
    16         <price>89.00</price>
    17     </book>
    18 </books>  

     

    Book.java

     

     1 public class Book {
     2 
     3     private int id;
     4     private String name;
     5     private float price;
     6 
     7     public int getId() {
     8         return id;
     9     }
    10 
    11     public void setId(int id) {
    12         this.id = id;
    13     }
    14 
    15     public String getName() {
    16         return name;
    17     }
    18 
    19     public void setName(String name) {
    20         this.name = name;
    21     }
    22 
    23     public float getPrice() {
    24         return price;
    25     }
    26 
    27     public void setPrice(float price) {
    28         this.price = price;
    29     }

     

    PullXmlActivity.java

     

    public class PullXmlActivity extends Activity{
        private List<Book> list=null;
        private PullXmlAdapter adapter;
        private ListView lv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listview);
            lv=(ListView)findViewById(R.id.listView);
            InputStream in;
            try {
                in = this.getAssets().open("books.xml");
                
                list=pullxml(in);
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            adapter=new PullXmlAdapter(PullXmlActivity.this, list);    
            lv.setAdapter(adapter);
        }
        /**xml文件的获取
         * 1.xml文件放在res的xml文件夹下(推荐)使用XmlResourceParser xmlParser = this.getResources().getXml(R.xml.XXX);
         * 2.xml文件放在raw的xml文件夹下使用InputStream inputStream =this.getResources().openRawResource(R.raw.XXX); 
         * 3.xml文件放在assets文件夹下(本人测试发现通过此方法获取的XML文档不能带有首行:<?xml version="1.0" encoding="utf-8"?>,
         * 否则解析报错,具体原因未查明:InputStream inputStream = getResources().getAssets().open(fileName);
         * 4.xml文件放在SD卡, path路径根据实际项目修改,此次获取SDcard根目录:   
         * String path = Environment.getExternalStorageDirectory().toString();  
         * File xmlFlie = new File(path+fileName);  
         * InputStream inputStream = new FileInputStream(xmlFlie);  
         */
        public List<Book> pullxml(InputStream in)throws Exception{
            List<Book> list=null;
            Book book = null;
                // 由android.util.Xml创建一个XmlPullParser实例
                XmlPullParser parser = Xml.newPullParser();
                // 设置输入流 并指明编码方式
                   parser.setInput(in, "UTF-8");
                // 产生第一个事件
                   int eventType = parser.getEventType();
                   
                   while (eventType != XmlPullParser.END_DOCUMENT) {
                       switch (eventType) {
                    // 判断当前事件是否为文档开始事件
                       case XmlPullParser.START_DOCUMENT:
                           list=new ArrayList<Book>();// 初始化list集合
                           break;
                        // 判断当前事件是否为标签元素开始事件
                       case XmlPullParser.START_TAG:
                           if (parser.getName().equals("book")) { // 判断开始标签元素是否是book
                               book = new Book();
                           } else if (parser.getName().equals("id")) {
                               eventType = parser.next();
                               // 得到book标签的属性值,并设置book的id
                                book.setId(Integer.parseInt(parser.getText()));
                            } else if (parser.getName().equals("name")) { // 判断开始标签元素是否是book
                                 eventType = parser.next();
                                 book.setName(parser.getText());
                            } else if (parser.getName().equals("price")) { // 判断开始标签元素是否是price
                                eventType = parser.next();
                                 book.setPrice(Float.parseFloat(parser.getText()));
                            }
                           break;
                        // 判断当前事件是否为标签元素结束事件
                       case XmlPullParser.END_TAG:
                           if (parser.getName().equals("book")) { // 判断结束标签元素是否是book
                               list.add(book); // 将book添加到books集合
                               book = null;
                           }
                           break;
                       }
                       // 进入下一个元素并触发相应事件
                       eventType = parser.next();
                   }
                   return list;
        }
    }

     

    PullXmlAdapter.java

     1 public class PullXmlAdapter extends BaseAdapter {
     2     private List<Book> list=null;
     3     private Context context=null;
     4     private LayoutInflater inflater=null;
     5     
     6 public PullXmlAdapter(Context context,List<Book> list) {
     7     // TODO Auto-generated constructor stub
     8     this.context=context;
     9     this.list=list;
    10 }
    11     @Override
    12     public int getCount() {
    13         // TODO Auto-generated method stub
    14         return list.size();
    15     }
    16 
    17     @Override
    18     public Object getItem(int arg0) {
    19         // TODO Auto-generated method stub
    20         return arg0;
    21     }
    22 
    23     @Override
    24     public long getItemId(int arg0) {
    25         // TODO Auto-generated method stub
    26         return arg0;
    27     }
    28 
    29     @Override
    30     public View getView(int arg0, View arg1, ViewGroup arg2) {
    31         // TODO Auto-generated method stub
    32         inflater=LayoutInflater.from(context);
    33         View v=inflater.inflate(R.layout.listview_item, null);
    34         TextView tv=(TextView)v.findViewById(R.id.lisview_item_tv);
    35         tv.setText(list.get(arg0).getName());
    36         return v;
    37     }
    38 
    39 }

     

     

  • 相关阅读:
    [转]Maven 初学+http://mvnrepository.com/
    比较IDEA与Eclipse
    [web] 使用Promise封装fetch实现网络超时,终止请求的功能
    [web] 理解和使用Promise.all和Promise.race
    [Web] How to Test React and MobX with Jest
    [Web 测试] Jest单元测试的几个指标
    [Web] 取消Promise
    [安全分析] 安全分析中的威胁情报(一)
    [Web] 深入理解现代浏览器
    [Web] HTML5新特性history pushState/replaceState解决浏览器刷新缓存
  • 原文地址:https://www.cnblogs.com/ggzjj/p/2856515.html
Copyright © 2020-2023  润新知