安卓解析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();
}
}
}
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();
}
}
}
结果: