安卓解析XML文件

安卓解析XML文件

主要有三种方式:DOM解析、SAX解析、PULL解析

其中:

DOM解析为等XMl文件全部加载后,然后根据需要解析的内容解析出所需的内容数据。

SAX解析为从XML文件中执行一行,就解析一行XML文件,只要解析到所需要的内容数据为止。

PULL解析在SAX的基础之上简化代码,由安卓提供解析方案,原理一样。

以下为三种解析方法的应用方法,其中都是解析同一个XML文件【note_item.xml】,该XML文件在raw目录下的:raw/note.xml

项目工程目录结构以及相关简单布局:

代码实现:

package com.lhy.xmlfiledom;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity
{
    //主界面上的Button按钮和TextView
     Button bt_dom;
     TextView tv_dom;
     Button bt_sax;
     TextView tv_sax;
     Button bt_pull;
     TextView tv_pull;
 /*****************************************************************************************************************************/
 @Override
 protected void onCreate ( Bundle savedInstanceState)
 {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      bt_dom = (Button) this.findViewById(R.id.bt_dom);
      tv_dom = (TextView) this.findViewById(R.id.tv_dom);
      bt_dom.setOnClickListener(onClickListener);
      bt_sax = (Button) this.findViewById(R.id.bt_sax);
      tv_sax = (TextView) this.findViewById(R.id.tv_sax);
      bt_sax.setOnClickListener(onClickListener);
      bt_pull = (Button) this.findViewById(R.id.bt_pull);
      tv_pull = (TextView) this.findViewById(R.id.tv_pull);
      bt_pull.setOnClickListener(onClickListener);
 }
 /*****************************************************************************************************************************/
//按钮事件
 OnClickListener onClickListener = new OnClickListener()
 {
  @Override
  public void onClick ( View v)
  {
   switch (v.getId())
   {
   case R.id.bt_dom:
    bt_dom_click();
    break;
   case R.id.bt_sax:
    bt_sax_click();
    break;
   case R.id.bt_pull:
    bt_pull_click();
    break;
   default:
    break;
   }
  }
 };
 /************************************************************************************************************************/
 // DOM解析XML文件【按钮触发的方法】
 protected void bt_dom_click ()
 {
  try
  {
   // 获取XMl文件流
   InputStream inputStream = this.getResources().openRawResource(R.raw.note_item);
   // 创建DOM工厂实例
   DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
   DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
   // 利用DOM对象读取XML文件流
   Document document = documentBuilder.parse(inputStream);
   // 根据标签从DOM对象读取相应数据返回结果集,获取标签为FrameLayout的DOM对象
   NodeList nodeList = document.getElementsByTagName("FrameLayout");
   // 获取该标签的第一个节点对象
   Node node = nodeList.item(0);
   // 获取该节点对象的属性
   NamedNodeMap namedNodeMap = node.getAttributes();
   // 利用属性获取该节点某一个属性值
   Node cureentnote = namedNodeMap.getNamedItem("android:id");
   // Node cureentnote = namedNodeMap.getNamedItemNS("",
   // "android:layout_width");
   String string = cureentnote.getNodeValue();
   Log.i("lhy", string);
   tv_dom.setText(string);
  }
  catch (Exception e)
  {
   Log.i("lhy", "Exception");
   e.printStackTrace();
  }
 }
 /***************************************************************************************************************************/
//SAX解析文件defaultHandler 
 DefaultHandler defaultHandler = new DefaultHandler()
 {
  int tag = 0;
  @Override
  public void startDocument () throws SAXException
  {
  }
  @Override
  public void endDocument () throws SAXException
  {
  }
  @Override
  public void startElement ( String uri, String localName, String qName, Attributes attributes) throws SAXException
  {
    //要解析的标签,Xml文件中可能有多个该标签,这里解析文件中第三个TextView标签里面的android:id的值
   if (localName.equals("TextView"))
   {
    tag++;
    if (tag == 3)
    {
     tv_sax.setText(attributes.getValue("android:id"));
    }
   }
  }
  @Override
  public void endElement ( String uri, String localName, String qName) throws SAXException
  {
  }
  @Override
  public void characters ( char[] ch, int start, int length) throws SAXException
  {
  }
 };
 // SAX解析XML文件【按钮触发的方法】
 protected void bt_sax_click ()
 {
  try
  {
   // 获取XMl文件流
   InputStream inputStream = this.getResources().openRawResource(R.raw.note_item);
   // 创建SAX工厂实例
   SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
   SAXParser saxParser = saxParserFactory.newSAXParser();
   saxParser.parse(inputStream, defaultHandler);
  }
  catch (ParserConfigurationException e)
  {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  catch (SAXException e)
  {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  catch (IOException e)
  {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 /*******************************************************************************************************************************/
 // PULL解析XML文件【按钮触发的方法】
 protected void bt_pull_click ()
 {
  try
  {
   // 获取XMl文件流
   InputStream inputStream = this.getResources().openRawResource(R.raw.note_item);
   // 创建PULL工厂实例
   XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
   XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
   xmlPullParser.setInput(inputStream, "utf-8");
   boolean b = true;
   int tag = 0;
   while (b)
   {
    int eventType = xmlPullParser.next();
    //这里用switch 替代了SAX中的defaultHandler ,简化代码
    switch (eventType)
    {
    case XmlPullParser.START_DOCUMENT:
     break;
    case XmlPullParser.END_DOCUMENT:
     b = false;
     break;
    case XmlPullParser.START_TAG:
     //要解析的标签,Xml文件可能有多个该标签,这里解析文件中第一个TextView标签里面的android:id的值
     if (xmlPullParser.getName().equals("TextView"))
     {
      tag++;
      if (tag == 1)
      {
       tv_pull.setText(xmlPullParser.getAttributeValue("", "android:id"));
       b = false;
      }
     }
     break;
    case XmlPullParser.END_TAG:
     break;
    case XmlPullParser.TEXT:
     break;
    default:
     break;
    }
   }
  }
  catch (XmlPullParserException e)
  {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  catch (IOException e)
  {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

结果:

 

posted on 2013-10-26 15:50  知行立远  阅读(632)  评论(0编辑  收藏  举报