sunplusedu的个人空间 https://blog.eetop.cn/sunplusedu [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

【凌阳教育学堂】Android中XML文件的三种解析方式

已有 897 次阅读| 2011-12-7 19:02 |个人分类:嵌入式培训

来源: 凌阳教育嵌入式培训
  凌阳教育是全国唯一 “学员就业双100%品牌”,保证“学员100%就业”,保证“学员100%满意就业”。凌阳教育也是全国唯一“按班公布学员就业去向诚信机构”,每个班 所有学员来自哪个学校就业后签约哪家企业都真实发布。截止2011年9月,凌阳教育学员已连续27期“双100%就业”。凌阳教育是全国唯一“原厂嵌入式 培训机构”,以凌阳科技产业链企业的人才需求为契机,先后与2500多家企业建立学员就业合作关系。

  具体实现步骤:

  首先我们需要一个xml文件。该xml文件中的内容比较简单,仅供实现这个功能。

  persons.xml:

  < ?xml version="1.0" encoding="utf-8"?>
   < persons>
       < person id="1">
           < name>刘备< /name>
           < age>12< /age>   
       < /person>
       < person id="2">
           < name>刘欢< /name>
           < age>14< /age>   
       < /person>
       < person id="3">
           < name>李明< /name>
           < age>15< /age>   
       < /person>
   < /persons>

  我们可以看到xml文件中只有一个person对象,所以我们必须定义一个person类。

  下面是java代码:

  Person.java

   package cn.yj3g.entity;
   public class Person {
 
       private int id;
       private String name;
       private int age;
       public Person(int id, String name, int age) {
           super();
           this.id = id;
           this.name = name;
           this.age = age;
       }
       public Person() {
           super();
       }
       public int getId() {
           return id;
       }
 
       public void setId(int id) {
           this.id = id;
       }
       public String getName() {
           return name;
       }
       public void setName(String name) {
           this.name = name;
       }
       public int getAge() {
           return age;
       }
       public void setAge(int age) {
           this.age = age;
       }
       @Override
       public String toString() {
           return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
       }
   }
  由于三种解析方法都实现了一个功能,就是对xml文件进行解析,所以在这里我们可以将解析方法定义为一个接口,三种解析方法都实现这个接口。下面是实现的接口。

  IXmlParseService:

   package cn.yj3g.service;
 
   import java.io.InputStream;
   import java.util.List;
   import cn.yj3g.entity.Person;
   //定义一个接口
   public interface IXmlParseService {
       //接口中的一个解析方法。如果引用这个接口,就要实现这个方法,这样做更简便,封装性更好。
       public List< Person> getPersonsByParseXml(InputStream is) throws Exception;
   }

  下来就是具体用三种方式对xml实现解析。下面是三种解析方式的具体代码:

  < 1>DOM解析    DomParseService:

  package cn.yj3g.service;
   
   import java.io.InputStream;
   import java.util.ArrayList;
   import java.util.List;
   import javax.xml.parsers.DocumentBuilder;
   import javax.xml.parsers.DocumentBuilderFactory;
   import org.w3c.dom.Document;
   import org.w3c.dom.Element;
   import org.w3c.dom.Node;
   import org.w3c.dom.NodeList;
   import cn.yj3g.entity.Person;
   /**
    * DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。Node对象提供了一系列常量来代表结点的类型
    * ,当开发人员获得某个Node类型后,就可以把Node节点转换成相应节点对象(Node的子类对象),以便于调用其特有的方法。
    * Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容.
    *
    * 缺点:
    * 一次性的完全加载整个xml文件,需要消耗大量的内存。
    */
   public class DomParseService implements IXmlParseService {
 
       @Override
       public List< Person> getPersonsByParseXml(InputStream is) throws Exception {
           List< Person> list = null;
           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
           DocumentBuilder builder = factory.newDocumentBuilder();
           Document document = builder.parse(is);
           // 得到根元素,这里是persons
           Element root = document.getDocumentElement();
           // 得到一个集合,里面存放在xml文件中所有的person
           NodeList nodeList = root.getElementsByTagName("person");
           //
           if (nodeList == null || nodeList.getLength() == 0) {
               return null;
           }
           // 初始化
           list = new ArrayList< Person>();
  
           for (int i = 0; i < nodeList.getLength(); i++) {
               // xml中的person标签
               Element element = (Element) nodeList.item(i);
               Person p = new Person();
               // 得到person的id属性
               int id = Integer.parseInt(element.getAttribute("id"));
               p.setId(id);
               // 得到name
               String name = getAttrText(element, "name");
               p.setName(name);
               // 得到age
               String age = getAttrText(element, "age");
               p.setAge(new Integer(age));
 
               list.add(p);
           }
           return list;
       }
 
       /**
        * 获得指定元素的子元素中的文本内容
        */
       public String getAttrText(Element element, String name) {
           NodeList nodeList2 = element.getChildNodes();
           Node node = null;
           for (int i = 0; i < nodeList2.getLength(); i++) {
               node = nodeList2.item(i);
               if (node.getNodeName().equals(name)) {
                   return node.getTextContent();
               }
           }
           return null;
       }
   }
  < 2>SAX解析  SAXParseService:

  package cn.yj3g.service;

  import java.io.InputStream;
  import java.util.ArrayList;
  import java.util.List;
  import javax.xml.parsers.SAXParser;
  import javax.xml.parsers.SAXParserFactory;
  import org.xml.sax.Attributes;
  import org.xml.sax.SAXException;
  import org.xml.sax.helpers.DefaultHandler;
  import cn.yj3g.entity.Person;
  /**
   * 优点:SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
   *
   */
  public class SAXParseService implements IXmlParseService {
      public List< Person> getPersonsByParseXml(InputStream is) throws Exception {

          SAXParserFactory factory = SAXParserFactory.newInstance();
          SAXParser parser = factory.newSAXParser();
          saxHandler handler = new saxHandler();
          //
          parser.parse(is, handler);
          return handler.getList();
      }
      // 自定义一个handler实现DefaultHandler并 重写它的相关方法
      private class saxHandler extends DefaultHandler {
          String currunt = null;
         List< Person> list = null;
          Person p = null;

          @Override
          public void startDocument() throws SAXException {
               list = new ArrayList< Person>();
          }

          @Override
          public void endDocument() throws SAXException {
          }

          // 开始解析元素
          @Override
          public void startElement(String uri, String localName, String qName,
                  Attributes attributes) throws SAXException {
              if ("person".equals(localName)) {
                  p = new Person();
                  p.setId(Integer.parseInt(attributes.getValue("id")));
              } else if ("name".equals(localName) || "age".equals(localName)) {
                  currunt = localName;
              }
          }

          // 元素解析结束
          @Override
          public void endElement(String uri, String localName, String qName)
                  throws SAXException {
              if ("person".equals(localName)) {
                  list.add(p);
              } else if ("name".equals(localName) || "age".equals(localName)) {
                  currunt = null;
              }
          }

          // 解析文本
          @Override
          public void characters(char[] ch, int start, int length)
                  throws SAXException {
              String s = new String(ch, start, length);
              if ("name".equals(currunt)) {
                  p.setName(s);
              } else if ("age".equals(currunt)) {
                  p.setAge(Integer.parseInt(s));
              }
          }

          // 返回list
          public List< Person> getList() {
              return list;
          }
      }
  }
  < 3>PULL解析  PullParseService:

  package cn.yj3g.service;

  import java.io.InputStream;
  import java.util.ArrayList;
  import java.util.List;
  import org.xmlpull.v1.XmlPullParser;
  import org.xmlpull.v1.XmlPullParserFactory;
  import cn.yj3g.entity.Person;
  /**
   * 优点:不是一次加载,中途可以停止。
   *
   */
  public class PullParseService implements IXmlParseService {
      public List< Person> getPersonsByParseXml(InputStream is) throws Exception {

          List< Person> list = null;
          Person p = null;
          XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
          XmlPullParser parser = factory.newPullParser();
          //设置输入流
          parser.setInput(is, "utf-8");
          //parser的几种事件类型
          int type = parser.getEventType();
          while (type != XmlPullParser.END_DOCUMENT) {
              //
              String typename = parser.getName();
              switch (type) {
              //文档开始 -->xml中的persons
              case XmlPullParser.START_DOCUMENT:
                  list = new ArrayList ();
                  break;
              //元素开始
              case XmlPullParser.START_TAG:
                  if ("person".equals(typename)) {
                      p = new Person();
                      p.setId(Integer.parseInt(parser.getAttributeValue(0)));
                      //
                  } else if ("name".equals(typename)) {
                      p.setName(parser.nextText());
                      //
                  } else if ("age".equals(typename)) {
                      p.setAge(Integer.parseInt(parser.nextText()));
                  }
                  break;
              //元素结束   
              case XmlPullParser.END_TAG:
                  if ("person".equals(typename)) {
                      list.add(p);
                      p=null;
                      break;
                  }
              }
              //最最重要的一步,pull解析中的特有的方法,解析下一个标签
              type = parser.next();
          }
          return list;
      }
  }
  下来就是在主界面上通过Button设置监听来调用三种解析方法对xml文件进行解析,并将解析出来的数据放在一个ListView中。
  主界面:XMLParseActivity:

   package cn.yj3g.XMLParseActivity;
 
   import java.io.InputStream;
   import java.util.ArrayList;
   import java.util.HashMap;
   import java.util.List;
   import java.util.Map;
   import android.app.ListActivity;
   import android.content.res.AssetManager;
   import android.os.Bundle;
   import android.view.View;
   import android.view.View.OnClickListener;
   import android.widget.SimpleAdapter;
   import cn.yj3g.TL23_xml_test.R;
   import cn.yj3g.entity.Person;
   import cn.yj3g.service.DomParseService;
   import cn.yj3g.service.PullParseService;
   import cn.yj3g.service.SAXParseService;
  
   public class XMLParseActivity extends ListActivity implements
           OnClickListener {
       @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
   
           // 找到Button按钮并添加监听
           findViewById(R.id.btn_dom).setOnClickListener(this);
           findViewById(R.id.btn_sax).setOnClickListener(this);
           findViewById(R.id.btn_pull).setOnClickListener(this);
       }
   
       public void onClick(View v) {
           int id = v.getId();
           //定义一个List容器来存放Person对象
           List< Person> list = null;
           //
           InputStream is = null;
           AssetManager manager = getAssets();
           try {
               //找到解析的文件
               is = manager.open("persons.xml");
               switch (id) {
               case R.id.btn_dom:
                   //调用DOM解析方法对文件进行解析
                   list = new DomParseService().getPersonsByParseXml(is);
                   break;
               case R.id.btn_sax:
                   //调用SAX解析方法对文件进行解析
                   list = new SAXParseService().getPersonsByParseXml(is);
                   break;
               case R.id.btn_pull:
                   //调用PULL解析方法对文件进行解析
                   list = new PullParseService().getPersonsByParseXml(is);
                   break;
                default:
                   break;
               }
           } catch (Exception e) {
               e.printStackTrace();
           }
           showUI(list);
       }
    
       //运用Adapter方法将所得到的List< Person>显示在ListView中
       public void showUI(List< Person> list) {
           List< Map< String, Object>> data = new ArrayList< Map< String, Object>>();
           for (Person p : list) {
               Map< String, Object> map = new HashMap< String, Object>();
               map.put("id", p.getId());
               map.put("name", p.getName());
               map.put("age", p.getAge());
               data.add(map);
           }
           String[] from = { "id", "name", "age" };
           int[] to = { R.id.tv_id, R.id.tv_name, R.id.tv_age };
           SimpleAdapter adapter = new SimpleAdapter(this, data,
                   R.layout.person_list_item, from, to);
           setListAdapter(adapter);
       }
   }

  布局文件:

  main.xml:

  < ?xml version="1.0" encoding="utf-8"?>
  < LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
      < LinearLayout
          android:orientation="horizontal"
          android:layout_width="fill_parent"
          android:layout_height="50dip"
          android:background="#222222">
          < Button  android:id="@+id/btn_dom"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:text="DOM显示"
              android:layout_weight="1.0"
              android:layout_gravity="center"/>
          < Button  android:id="@+id/btn_sax"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:text="SAX显示"
              android:layout_weight="1.0"
              android:layout_gravity="center"/>
          < Button  android:id="@+id/btn_pull"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:text="PULL显示"
              android:layout_weight="1.0"
              android:layout_gravity="center"/>
      < /LinearLayout>
      < LinearLayout  
      android:orientation="horizontal"
        android:layout_height="wrap_content"
         android:layout_width="fill_parent">
          < TextView 
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:text="ID"
              android:layout_weight="1.0"
              android:layout_gravity="center"/>
           < TextView 
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:text="姓名"
              android:layout_weight="1.0"
              android:layout_gravity="center"/>
          < TextView 
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:text="年龄"
              android:layout_weight="1.0"
              android:layout_gravity="center"/>
         < /LinearLayout>
      < ListView android:id="@android:id/list" 
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:layout_weight="1"/>
   < /LinearLayout>

  person_list_item.xml:

   < ?xml version="1.0" encoding="utf-8"?>
   < LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
       < TextView android:id="@+id/tv_id"
           android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_weight="1"/>
       < TextView android:id="@+id/tv_name"
           android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_weight="1"/>
       < TextView android:id="@+id/tv_age"
           android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_weight="1"/>
   < /LinearLayout>

  这样我们这个项目就做好了,就可以实现解析xml的功能了。

  凌阳教育“学员就业 双100%”的诚信获得了社会的广泛认可,2008年、2009年、2010年,凌阳教育连续三年荣膺新浪“中国十大品牌IT教育机构”、新浪“最具就业 竞争力IT教育机构”、搜狐“中国十大品牌IT培训机构”、网易“中国十大IT教育品牌”荣誉称号。凌阳教育是嵌入式培训领域,唯一全部获得三大门户网站 “十大IT品牌”表彰的机构。

嵌入式培训

  凌阳教育嵌入式培训,值得信赖的嵌入式教育品牌!
http://www.sunplusedu.com/content3526.shtml

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 2

    评论
  • 1928

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-8 13:11 , Processed in 0.025118 second(s), 16 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部