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 }
原文:http://www.cnblogs.com/liul/p/4963587.html