XML文件解析

 具体实现步骤:

  首先我们需要一个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<Person>();
                  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的功能了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值