首页 > 其他 > 详细

XML文件解析

时间:2015-11-14 01:02:51      阅读:248      评论:0      收藏:0      [点我收藏+]

XML文件解析主要有以下四步:

1.创建事件处理程序
2.创建SAX解析器
3.将事件解析器分配给解析器
4.对文档进行解析,将每个事件发送给处理程序

核心代码:

SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader();
// 为XML设置内容处理器
reader.setContentHandler(new 处理器);
// 开始读取
reader.parse(InputSource input);

 

1.首先我们创建一个XML文件在asset文件下,名称为Worker.XML

 1 <?xml version="1.0" encoding="UTF-8"?> 
 2 <workers>  
 3     <worker>  
 4         <name>ll</name>  
 5         <age>28</age>  
 6     </worker>  
 7     <worker>  
 8         <name>meiy</name>  
 9         <age>23</age>  
10     </worker>
11 </workers>  

2.在src目录下创建一个与XML对应的类Worker

 1 package com.ll.xml;
 2 
 3 public class Worker {
 4     
 5     private String name; // 姓名
 6     private String age;  // 年龄
 7     
 8     public void setName(String name){
 9         this.name = name;
10     }
11     
12     public void setAge(String age){
13         this.age = age;
14     }
15     
16     public String getName(){
17         return name;
18     }
19     
20     public String getAge(){
21         return age;
22     }
23     
24     public String getInfo(){
25         return "资料:"+"姓名-"+getName()+" 年龄:"+getAge();
26     }
27 }

3.接下来我们写布局文件,非常简单,里面只有一个Button和TextView

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context="com.ll.xml.MainActivity" >
10     
11     <Button 
12         android:id="@+id/btn"
13         android:layout_width="match_parent"
14         android:layout_height="wrap_content"
15         android:text="开始解析XML文件"/>
16 
17     <TextView
18         android:id="@+id/txt"
19         android:layout_width="match_parent"
20         android:layout_height="wrap_content"
21         android:text="@string/hello_world" />
22 
23 </RelativeLayout>

4.接下来我们写一个非常重要的类,这个就是XML解析的处理程序,名称为WorkerSaxHandler,该类继承了DefaultHandler,

其中定义了一个List,每次解析出一个对象,就加入List中。当解析XML时,通过读取到不同的内容,驱动不同的事件来解析不同的

标签和标签的名称属性等,具体函数见代码。

  1 package com.ll.xml;
  2 
  3 import java.util.ArrayList;
  4 
  5 import org.xml.sax.Attributes;
  6 import org.xml.sax.SAXException;
  7 import org.xml.sax.helpers.DefaultHandler;
  8 
  9 public class WorkerSaxHandler extends DefaultHandler {
 10     
 11     // 1.申明一个装载Worker类型的List
 12     private ArrayList<Worker>  mList;
 13     // 2.申明一个Worker类型的变量
 14     private Worker               worker;
 15     // 3.申明一个字符串的变量,用于装载读取的字符内容
 16     private String               content;
 17     // 4.申明一个变量用来保存解析的标签名称
 18     private String                tagName;
 19     
 20     
 21     // 构造函数
 22     public WorkerSaxHandler(ArrayList<Worker> list){
 23         this.mList = list;
 24     }
 25 
 26     // 当SAX解析器解析到XML文档开始时,会调用的方法 
 27     @Override
 28     public void startDocument() throws SAXException {
 29         // TODO Auto-generated method stub
 30         super.startDocument();
 31         // 1.开始解析的时候可以打印一句话
 32         System.out.println("begin analysis");
 33     }
 34 
 35     // 当SAX解析器解析到XML文档结束时,会调用的方法 
 36     @Override
 37     public void endDocument() throws SAXException {
 38         // TODO Auto-generated method stub
 39         super.endDocument();
 40         // 1.解析文档结束的时候可以打印一句话
 41         System.out.println("end analysis");
 42     }
 43 
 44     // 当SAX解析器解析到某个元素开始时,会调用的方法
 45     // 其中localName记录的是元素属性名 
 46     @Override
 47     public void startElement(String uri, String localName, String qName,
 48             Attributes attributes) throws SAXException {
 49         // TODO Auto-generated method stub
 50         super.startElement(uri, localName, qName, attributes);
 51         tagName = localName;
 52         if(tagName.equals("worker")){
 53             worker = new Worker();
 54         }
 55     }
 56 
 57     // 当SAX解析器解析到某个元素结束时,会调用的方法 
 58     // 其中localName记录的是元素属性名
 59     @Override
 60     public void endElement(String uri, String localName, String qName)
 61             throws SAXException {
 62         // TODO Auto-generated method stub
 63         super.endElement(uri, localName, qName);
 64         // 判断是否是一个worker读取结束
 65         if(localName.equals("worker")){
 66             mList.add(worker);
 67             // System.out.println(worker.getInfo());
 68         }else if(localName.equals("name")){
 69             worker.setName(content);
 70         }else if(localName.equals("age")){
 71             worker.setAge(content);
 72         }
 73     }
 74 
 75     // 当SAX解析器解析到某个属性值时,会调用的方法 
 76     // 其中参数ch记录了这个属性值的内容
 77     @Override
 78     public void characters(char[] ch, int start, int length)
 79             throws SAXException {
 80         // TODO Auto-generated method stub
 81         super.characters(ch, start, length);
 82         content = new String(ch, start, length);
 83 //        if(tagName.equals("name")){
 84 //            worker.setName(content);
 85 //        }else if(tagName.equals("age")){
 86 //            worker.setAge(content);
 87 //        }
 88 //        System.out.println(ch);
 89 //        switch(tagName){
 90 //            case "name":
 91 //                worker.setName(content);
 92 //                break;
 93 //            case "age":
 94 //                worker.setAge(content);
 95 //                break;
 96 //            default:
 97 //                    break;
 98 //        }
 99     }
100 }

5.写MainActivity.为Button添加点击处理事件,在消息响应事件中定义解析器和事件处理程序对XML进行解析

  1 package com.ll.xml;
  2 
  3 import java.io.InputStream;
  4 import java.util.ArrayList;
  5 
  6 import javax.xml.parsers.SAXParserFactory;
  7 
  8 import org.xml.sax.InputSource;
  9 import org.xml.sax.XMLReader;
 10 
 11 import android.support.v7.app.ActionBarActivity;
 12 import android.content.res.AssetManager;
 13 import android.os.Bundle;
 14 import android.view.Menu;
 15 import android.view.MenuItem;
 16 import android.view.View;
 17 import android.view.View.OnClickListener;
 18 import android.widget.Button;
 19 import android.widget.TextView;
 20 
 21 // 1.创建事件处理程序
 22 // 2.创建SAX解析器
 23 // 3.将事件解析器分配给解析器
 24 // 4.对文档进行解析,将每个事件发送给处理程序
 25 /*
 26 // parser解析器
 27 SAXParserFactory factory = SAXParserFactory.newInstance();
 28 XMLReader reader = factory.newSAXParser().getXMLReader();
 29 // 为XML设置内容处理器
 30 reader.setContentHandler(new 处理器);
 31 // 开始读取
 32 reader.parse(InputSource input);
 33   */
 34 
 35 public class MainActivity extends ActionBarActivity {
 36     
 37     private ArrayList<Worker>      workerList = null;
 38     private Button                   mBtn;
 39     private TextView               textView;
 40 
 41     @Override
 42     protected void onCreate(Bundle savedInstanceState) {
 43         super.onCreate(savedInstanceState);
 44         setContentView(R.layout.activity_main);
 45         mBtn = (Button)findViewById(R.id.btn);
 46         textView = (TextView)findViewById(R.id.txt);
 47         mBtn.setOnClickListener(new BtnClickListener());
 48     }
 49 
 50     @Override
 51     public boolean onCreateOptionsMenu(Menu menu) {
 52         // Inflate the menu; this adds items to the action bar if it is present.
 53         getMenuInflater().inflate(R.menu.main, menu);
 54         return true;
 55     }
 56 
 57     @Override
 58     public boolean onOptionsItemSelected(MenuItem item) {
 59         // Handle action bar item clicks here. The action bar will
 60         // automatically handle clicks on the Home/Up button, so long
 61         // as you specify a parent activity in AndroidManifest.xml.
 62         int id = item.getItemId();
 63         if (id == R.id.action_settings) {
 64             return true;
 65         }
 66         return super.onOptionsItemSelected(item);
 67     }
 68     
 69     private class BtnClickListener implements OnClickListener{
 70 
 71         @Override
 72         public void onClick(View v) {
 73             // TODO Auto-generated method stub
 74             System.out.println("begin");
 75             if(workerList == null){
 76                 workerList =  new ArrayList<Worker>();
 77                 // 解析文件
 78                 try{
 79                     // 1.获取AssetManager管理器对象
 80                     AssetManager as = MainActivity.this.getAssets();
 81                     // 2.通过AssetManager的open方法获取到worker.xml文件的输入流
 82                     InputStream is = as.open("worker.xml");
 83                     // 3.通过获取到的InputStream来得到InputSource实例
 84                     InputSource isouce = new InputSource(is);
 85                     // 4.使用工厂方法初始化SaxParserFactory变量factory            
 86                     SAXParserFactory factory = SAXParserFactory.newInstance();
 87                     // 5.得到SMLReader
 88                     XMLReader reader = factory.newSAXParser().getXMLReader();
 89                     // 6.为XML设置内容处理器
 90                     reader.setContentHandler(new WorkerSaxHandler(workerList));
 91                     // 7.开始读取
 92                     reader.parse(isouce);
 93                     textView.setText(workerList.get(1).getName() + "----" + workerList.get(1).getAge());
 94                     
 95                 }catch(Exception e){
 96                     e.printStackTrace();
 97                 }// end of catch
 98             }// end of if(woerkerList == null)
 99         }
100     }
101 }

 

XML文件解析

原文:http://www.cnblogs.com/liul/p/4963587.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!