XML的Pull解析、SAX解析
2015-12-27 17:38
281 查看
一、Pull解析
二、SAX解析
解析:
package com.example.xml_pull_food; 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.os.Bundle; import android.util.Log; import android.util.Xml; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import com.example.model.Food; public class MainActivity extends Activity { //定义成员变量 private TextView tv_data; private Button btn; private Food food; //食物对象 private List<Food> list; //存放食物对象的集合 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找对象 // ImageView iv=(ImageView) findViewById(R.id.iv); // // Cursor c=getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null); // while(c.moveToNext()) // { // file=c.getString(c.getColumnIndex(Media.DATA)); //获取SDCard中的图片路径 // } // c.close(); // Log.e("TAG", "路径--->"+file); // BitmapFactory.Options options=new BitmapFactory.Options(); // options.inSampleSize=2; //设置清晰度 // Bitmap bm=BitmapFactory.decodeFile(file, options); // iv.setImageBitmap(bm); init(); } public void init() { //找对象 tv_data=(TextView) findViewById(R.id.tv_main); btn=(Button) findViewById(R.id.btn_parse); //按钮加监听 btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { xmlParse(); } }); } //解析xml数据 public void xmlParse() { InputStream inputstream=getResources().openRawResource(R.raw.data); //读取raw文件夹中的文档 XmlPullParser parser=Xml.newPullParser(); //获取XmlPullParser解析解析器 try { parser.setInput(inputstream, "utf-8"); //把读取的文档放到解析器中 参数:1.InputStream读取的文档 2.乱码 int flg=parser.getEventType(); //获取当前解析器事件类型 while(flg != XmlPullParser.END_DOCUMENT) //判断当前解析器的事件类型不是解析完成 { switch(flg){ case XmlPullParser.START_DOCUMENT: //开始解析文档 Log.e("TAG", "开始解析文档"); list=new ArrayList<Food>(); break; case XmlPullParser.START_TAG: //开始解析标签(元素) Log.e("TAG", "开始解析标签"); if(parser.getName().equals("foods")) { Log.e("TAG", "根节点"); }else if(parser.getName().equals("food")) { food=new Food(); food.setId(parser.getAttributeValue(null, "id")); //获取标签中属性的值并给对象赋值 }else if(parser.getName().equals("imageurl")) { food.setImageurl(parser.nextText()); //获取标签的值并给对象赋值 }else if(parser.getName().equals("foodtitle")) { food.setFoodtitle(parser.nextText()); }else if(parser.getName().equals("foodcontent")) { food.setFoodcontent(parser.nextText()); }else if(parser.getName().equals("foodprice")) { food.setFoodprice(parser.nextText()); } break; case XmlPullParser.END_TAG: //标签解析结束 Log.e("TAG", "标签解析结束"); if(parser.getName().equals("food")) { list.add(food); //把赋值好的对象添加到集合中 } break; case XmlPullParser.END_DOCUMENT: //文档解析结束 Log.e("TAG", "文档解析结束"); break; } flg=parser.next(); //移动到以一个标签 } } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.e("TAG", list.toString()); tv_data.setText(list.toString()); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
二、SAX解析
package com.example.xml_sax_parse; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import com.example.model.Persons; import com.example.saxparse.MySaxDefaultHandler; public class MainActivity extends Activity { private Button btn; private List<Persons> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } public void init() { //找对象 btn=(Button) findViewById(R.id.btn); ImageView i; btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { xmlParse(); } }); } //用SAM解析XML文件 public void xmlParse() { try { InputStream inputstream=getAssets().open("xxx.xml"); //读取assets文件夹中的二进制文件 SAXParserFactory factory=SAXParserFactory.newInstance(); //获取SAXParserFactory工厂 SAXParser parser=factory.newSAXParser(); //获取SAXParser解析器 MySaxDefaultHandler defaulthandler=new MySaxDefaultHandler(); //创建SAX的辅助类 parser.parse(inputstream, defaulthandler); //解析数据 list=defaulthandler.getList(); //获取解析了的数据 Log.e("TAG", "ACticity获取的数据:"+list.toString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
解析:
package com.example.saxparse; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import android.util.Log; import com.example.model.Persons; /** * 这是安卓中内置的用于SAX处理XML的类,但是大多情况下我们都需要继承该类重写部分方法,才能达到处理XML数据的功能。 * */ public class MySaxDefaultHandler extends DefaultHandler { //创建成员变量 private Persons persons; private List<Persons> list; private String element2; //接收每个标签名称,String的默认值为""空字符串,不是null //每处理一个XML文档都会响应一次 public void startDocument() throws SAXException { super.startDocument(); Log.e("TAG", "文档开始解析"); list=new ArrayList<Persons>(); //实例化集合 } //处理每个节点所触发的方法,通过这个方法你可以直接当前处理的节点的名称以及属性 //参数:1.命名空间 2.不带命名空间前缀的标签名 3.带命名空间前缀的标签名 4.可以得到所有的属性名和相应的值 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); Log.e("TAG", "标签开始解析"+localName); element2=localName; if(localName.equals("person")) { persons=new Persons();//创建对象 //给对象赋值 id,url persons.setId(attributes.getValue("id")); persons.setUrl(attributes.getValue("url")); Log.e("TAG", "标签解析开始的值:"+persons.getId()+","+persons.getUrl()); } } //当处理一个节点之间的文本时候触发该方法,但是该方法并不会告诉你当前文本的所属标签,而仅仅是告诉你文本内容 //参数:1.存放文件的内容 2.读到的字符串在这个数组中的起始位置 3.读到字符串的长度 public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); Log.e("TAG", "读取文本内容"); String txt=new String(ch, start, length); //使用new String(ch,start,length)就可以获取内容 //根据标签名称获取里的内容 if(element2.equals("name")) { Log.e("TAG", "获取的文本内容name="+txt); persons.setName(txt); //给对象的age属性赋值 }else if(element2.equals("age")) { Log.e("TAG", "获取的文本内容age="+txt); persons.setAge(txt); }else if(element2.equals("hobby")) { Log.e("TAG", "获取的文本内容age="+txt); persons.setHobby(txt); } } //遇到一个节点的结束标签时,将会出发这个方法,并且会传递结束标签的名称(这个方法和STARTELEMENT的方法相对应,在遇到结束标签的时候,调用这个方法) public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); Log.e("TAG", "标签解析结束"); element2=""; //恢复element2初始值,String默认值为"" if(localName.equals("person")) //结束时的标签 { list.add(persons); //把对象添加到字符串中 } } //如果当前的XML文档处理完毕后,将会触发该方法,在此方法内你可以将最终的结果保存并且销毁不需要使用的变量 public void endDocument() throws SAXException { super.endDocument(); Log.e("TAG", "文档解析结束"); } //返回List集合 public List<Persons> getList() { return list; } }
相关文章推荐
- Codeforces 607C:Marbles 纯脑洞。。。。
- 1.Animation的使用 - 使用动画创建一个不同的登陆界面
- STM32 EXTI中断设置五步曲 (备忘)
- ReactNativeiOS(三)开发零碎1 Fetch错误Network request failed
- 进程和线程的故事
- 域套接字代码示例(1)
- 计算机学院大学生程序设计竞赛(2015’12) 1005 Bitwise Equations
- 计算机学院大学生程序设计竞赛(2015’12) 1004 Happy Value
- 计算机学院大学生程序设计竞赛(2015’12) 1003 The collector’s puzzle
- 小编逗比生活之总结篇
- 关于STM32中RTC的校准方法
- Spring初始化数据库
- fileupload注意事项
- String详细学习
- 计算机学院大学生程序设计竞赛(2015’12) 1002 Polygon
- Android在ImageView控件中图片怎样铺满整个控件
- 能冒泡的事件
- 计算机学院大学生程序设计竞赛(2015’12) 1001 The Country List
- 扣丁学堂——Json解析
- iOS 提高tableView 性能的优化