Android中解析XML数据与雅虎泄露数据库下载问题,怎么解决

Android解析XML文件 - CSDN博客
Android解析XML文件
一、在Android应用中的XML文件来源
1、本地xml文件
& & 本地XML文件可以放在应用根目录assets文件夹、res/xml、res/raw、SDcard卡、应用的data目录等;
除res/xml可直接通过getXml(int id)获取XML文档,返回一个解析器对象(XmlResourceParer:XmlResourceParer是XmlPullParser的子类),其它位置情况都可以获取XML文档,返回一个Inputstream对象,进行读取数据,获取方法分别如下:
a.在res/xml目录下(推荐使用):
XmlResourceParser&xmlParser&=&this.getResources().getXml(R.xml.XXX);&&
b.在res/xml、res/raw目录下:
InputStream&inputStream&=&this.getResources().openRawResource(R.xml.XXX);&&
c.在assets文件夹下(本人测试发现通过此方法获取的XML文档不能带有首行:&?xml version=&1.0& encoding=&utf-8&?&,否则解析报错,具体原因未查明,知道原因请回复交流):
InputStream&inputStream&=&getResources().getAssets().open(fileName);&&
d.在应用指定目录下(SDcard,应用data目录等):
&&String&path&=&Environment.getExternalStorageDirectory().toString();&&File&xmlFlie&=&new&File(path+fileName);&&InputStream&inputStream&=&new&FileInputStream(xmlFlie);&&
2、通过url得到的xml文件
& & 很多时候需要解析xml文件都用于客户端与服务器之间的数据交互,比如解析google天气预报信息,或自己项目内定的一些XML数据结构,其中通过URL,使用DefaultHTTPClient get请求获取XML文件方法如下:
&&&&&&public&String&getStringByUrl(String&url)&{&&&&&&String&outputString&=&&&;&&&&&&&&&&&&DefaultHttpClient&httpclient&=&new&DefaultHttpClient();&&&&&&&&&&&&HttpGet&httpget&=&new&HttpGet(url);&&&&&&&&&&&&ResponseHandler&String&&responseHandler&=&new&BasicResponseHandler();&&&&&&&&try&{&&&&&&&&&&outputString&=&httpclient.execute(httpget,&responseHandler);&&&&&&&&&&outputString&=&new&String(outputString.getBytes(&ISO-8859-1&),&&utf-8&);&&&&&&&&&&&&&&&&Log.i(&HttpClientConnector&,&&连接成功&);&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&Log.i(&HttpClientConnector&,&&连接失败&);&&&&&&&&&&e.printStackTrace();&&&&&&}&&&&&&httpclient.getConnectionManager().shutdown();&&&&&&return&outputS&&}&&
二、XML文件的解析方式
& & 能够运用在Android系统上解析XML文件的常用有三种方式:DOM、SAX和PULL,其中DOM解析XML是先把XML文件读进内存中,再通过接口获取数据,该方法使用相对小的XML文件,移动设备往往受硬件性能影响,如果XML文件比较大使用DOM解析往往效率跟不上;SAX和PULL都是采用事件驱动方式来进行解析,在Android中的事件机制是基于回调函数。
& & 本例旨在考虑简单方便性,综合考虑选择了PULL解析,PULL解析器是一个开源项目,Android平台已经内置了PULL解析器,同时Android系统本身也是使用PULL解析器来解析各种XML文档。
& &&1、事件回调类型
& & PULL解析XML文件时,回调XmlResourceParser内定义表示文档开头结束和节点开头结束的数值(事件回调类型),表示如下:
a.读取到XML文档开头(声明)返回:XmlPullParser.START_DOCUMENT(0)
b.读取到XML文档结束返回:XmlPullParser.END_DOCUMENT (1)
c.读取到XML节点开始返回:XmlPullParser.START_TAG (2)
d.读取到XML节点结束返回:XmlPullParser.END_TAG (3)
e.读取到XML文本返回:XmlPullParser.TEXT (4)
2、XmlPullParser有几个主要方法(更多查阅Android APIs):
a.XmlPullParser.getEventType() :&Returns the type of the current event (START_TAG, END_TAG, TEXT, etc.) 【获取当前事件回调类型】
b.XmlPullParser.getName():For START_TAG or END_TAG events, the (local) name of the current element is returned when namespaces are enabled.【获取当前节点名字】
c.XmlPullParser.getAttributeValue(int index):Returns the given attributes value.【根据id获取节点属性值】
d.XmlPullParser.getAttributeValue(tring&namespace,&tring&name):Returns
the attributes value identified by namespace URI and namespace localName.【根据name获取节点属性值】
e.XmlPullParser.netxText():If current event is START_TAG then if next element is TEXT then element content is returned or if next event is
END_TAG then empty string is returned, otherwise exception is thrown.【回调节点START_TAG时,通过此方法获取节点内容】
3、实际编码中如何使用
& & 在实际编码中,主要根据事件回调类型,结合被解析的XML结构进行解析提取数据,PULL解析XML文件的主要模式如下,更具体使用看本文提供的例子:
try&{&&&&&&&&&&&&int&eventType&=&parser.getEventType();&&&&&&&&&&&&&&while&(eventType&!=&XmlPullParser.END_DOCUMENT)&{&&&&&&&&&&&&&&&&&&&&&switch&(eventType)&{&&&&&&&&&&&&&&case&XmlPullParser.START_DOCUMENT:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&case&XmlPullParser.START_TAG:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&String&tagName&=&parser.getName();&&&&&&&&&&&&&&&&&&&&if(tagName.equals(&XXXTAGXXX&)){&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&case&XmlPullParser.END_TAG:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&case&XmlPullParser.END_DOCUMENT:&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&eventType&=&parser.next();&&&&&&}&&}&catch&(XmlPullParserException&e)&{&&&&&&e.printStackTrace();&&}catch&(IOException&e)&{&&&&&&e.printStackTrace();&&}&&
三、运用例子
& & 本例主要是解析我国省市的XML文件,文件结构简单,本例采用资源数据地址:/CityScene_I/getPlace.php,关于XML的结构基础之类的就不再累赘,实际项目中,根据XML文件的节点结果来进行变换,主要修改case XmlPullParser.START_TAG部分代码。
& & 1.本例在获取XML文件的省份中,比较了获取三个不同位置的XML文件资源的读取方式;
& & 2.再获取url上的XML文件时,返回的字符串进行utf-8转码,避免中文乱码(本例采用的url资源数据需要转码);
& & 3.针对实际项目中,若xml文件过大,可以使用多线程进行解析,避免ANR,若解析时间较长,可以添加滚动提示;
& & 4.本例存在个Bug,根据例子使用的XML文件结构把直辖市也编进省份中,例子目的是解析XML文件,实际项目是需要避免;
& & 5.主要代码:
& & & a.各种获取XML文件资源方式
&&&&&&&&&&&public&InputStream&getInputStreamFromAssets(String&fileName){&&&&&&try&{&&&&&&&&&&InputStream&inputStream&=&getResources().getAssets().open(fileName);&&&&&&&&&&return&inputS&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&e.printStackTrace();&&&&&&}&&&&&&return&null;&&}&&&&&&&&&&&public&XmlResourceParser&getXMLFromResXml(String&fileName){&&&&&&XmlResourceParser&xmlParser&=&null;&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&xmlParser&=&this.getResources().getXml(R.xml.provinceandcity);&&&&&&&&&&/*/&&&&&&&&&&&&&&&&&&&&InputStream&inputStream&=&this.getResources().openRawResource(R.xml.provinceandcity);&&&&&&&&&&&&&&&&&&&&&&&&public&String&getStringByUrl(String&url)&{&&&&&&String&outputString&=&&&;&&&&&&&&&&&&DefaultHttpClient&httpclient&=&new&DefaultHttpClient();&&&&&&&&&&&&HttpGet&httpget&=&new&HttpGet(url);&&&&&&&&&&&&ResponseHandler&String&&responseHandler&=&new&BasicResponseHandler();&&&&&&&&try&{&&&&&&&&&&outputString&=&httpclient.execute(httpget,&responseHandler);&&&&&&&&&&outputString&=&new&String(outputString.getBytes(&ISO-8859-1&),&&utf-8&);&&&&&&&&&&&&&&&&Log.i(&HttpClientConnector&,&&连接成功&);&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&Log.i(&HttpClientConnector&,&&连接失败&);&&&&&&&&&&e.printStackTrace();&&&&&&}&&&&&&httpclient.getConnectionManager().shutdown();&&&&&&return&outputS&&}&&&&&&&&&&&&&&&public&InputStream&getInputStreamFromSDcard(String&fileName){&&&&&&try&{&&&&&&&&&&&&&&&&&&&&String&path&=&Environment.getExternalStorageDirectory().toString()&+&&/test_xml/&;&&&&&&&&&&&&Log.v(&&,&&path&:&&&+&path);&&&&&&&&&&&&File&xmlFlie&=&new&File(path+fileName);&&&&&&&&&&&&InputStream&inputStream&=&new&FileInputStream(xmlFlie);&&&&&&&&&&&&return&inputS&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&e.printStackTrace();&&&&&&}&&&&&&return&null;&&}&&
& & & b.多线程解析:
&&&&Handler&mHandler&=&new&Handler();&&&&&Runnable&mRunnable&=&new&Runnable()&{&&&&&&public&void&run()&{&&&&&&&&&&if(!isFinishParser){&&&&&&&&&&&&&&&&mHandler.postDelayed(mRunnable,&1000);&&&&&&&&&&&&&&}else{&&&&&&&&&&&&&&showView.setText(provinceStr);&&&&&&&&&&&&&&mHandler.removeCallbacks(mRunnable);&&&&&&&&&&}&&&&&&}&&};&&&&&&&&public&void&parserWhitThread(){&&&&&&new&Thread(){&&&&&&&&&&@Override&&&&&&&&&&public&void&run()&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&provinceandcityStr&=&getStringByUrl(provinceAndCityUrl);&&&&&&&&&&&&&&provinceArray&=&ProvincePullParse.Parse(provinceandcityStr);&&&&&&&&&&&&&&for(Province&pro&:&provinceArray){&&&&&&&&&&&&&&&&&&provinceStr&+=&pro.getProvinceId()&+&&&:&&&+pro.getProvinceName()+&\n&;&&&&&&&&&&&&&&}&&&&&&&&&&&&&&isFinishParser&=&true;&&&&&&&&&&}&&&&&&}.start();&&}&&
& & & c.从XML文件中解析出城市:
public&static&ArrayList&City&&ParseXml(XmlPullParser&parser){&&&&&&ArrayList&City&&CityArray&=&new&ArrayList&City&();&&&&&&City&CityTemp&=&null;&&&&&&int&provinceId&=&0;&&&&&&int&cityId;&&&&&&String&cityN&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&int&eventType&=&parser.getEventType();&&&&&&&&&&&&&&&&&&&&&&while&(eventType&!=&XmlPullParser.END_DOCUMENT)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&switch&(eventType)&{&&&&&&&&&&&&&&&&&&case&XmlPullParser.START_DOCUMENT:&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&&&&&case&XmlPullParser.START_TAG:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&String&tagName&=&parser.getName();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(tagName.equals(&province&)){&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&provinceId&=&Integer.parseInt(parser.getAttributeValue(0));&&&&&&&&&&&&&&&&&&&&&&}else&if(tagName.equals(&item&)){&&&&&&&&&&&&&&&&&&&&&&&&&&CityTemp&=&new&City();&&&&&&&&&&&&&&&&&&&&&&}else&if(tagName.equals(&id&)){&&&&&&&&&&&&&&&&&&&&&&&&&&cityId&=&Integer.parseInt(parser.nextText());&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&parser.next();&&&&&&&&&&&&&&&&&&&&&&&&&&cityName&=&parser.nextText();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Log.v(&&,&&id&getText:&&+cityId);&&&&&&&&&&&&&&&&&&&&&&&&&&Log.v(&&,&&name&getText:&&+cityName);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Log.e(&&,&&=========================&);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&CityTemp.setProvinceId(provinceId);&&&&&&&&&&&&&&&&&&&&&&&&&&CityTemp.setCityId(cityId);&&&&&&&&&&&&&&&&&&&&&&&&&&CityTemp.setCityName(cityName);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&CityArray.add(CityTemp);&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&&&&&case&XmlPullParser.END_TAG:&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&&&case&XmlPullParser.END_DOCUMENT:&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&eventType&=&parser.next();&&&&&&&&&&}&&&&&&}&catch&(XmlPullParserException&e)&{&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&}catch&(IOException&e)&{&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&}&&&&&&&&return&CityA&&}&&
源码下载:
1.谷歌天气预报:
2.android解析xml文件的三种方式:
3.Android APIs:
本文已收录于以下专栏:
相关文章推荐
在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式,今天学习了Android—XML文件解析三种方法中的一种较常用的SAX,它不能向文...
1、文件目录
2、weather.xml
3、解析xml文件源码
(1)channel.java文件
public class Channel {
private S...
Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)工作的时候需要往后台发送一个post数据请求
其中发送的xml数据为:
&?xml version = “1.0” ?&
&SSOMessage version=”1.0”&
&SSOParas&
&SeqID&SeqID&/SeqID&
&CommandID&CommandID&/CommandID&
&MSISDN&ABSCDSDF&/MSISDN&
&ChargeMSISDN&ChargeMSISDN&/ChargeMSISDN&
&SPID&SPID&/SPID&
&Code& Code &/ Code &
& IDtype & IDtype 0&/ IDtype &
&ID& ID 0&/ID&
&/SSOParas&
&/SSOMessage&
返回的xml数据为:
&?xml version = “1.0” ?&
&SSOMessage version=”1.0”&
&SSOParas&
&SeqID&SeqID&/SeqID&
&ResultCode&ResultCode0&/ResultCode&
&/SSOParas&
&/SSOMessage&
然后进行解析,代码如下,参考一下,对于以后再做post请求的时候,做参考
class httpThread implements Runnable {
/* (non-Javadoc)
* @see java.lang.Runnable#run()
public void run() {
// TODO Auto-generated method stub
//组建xml数据
StringBuilder xml = new StringBuilder();
xml.append(&&?xml version=\&1.0\& encoding=\&UTF-8\&?&&);
xml.append(&&SSOMessage version=\&1.0\&&&);
xml.append(&&SSOParas&&);
xml.append(&&SeqID&&/SeqID&&);
xml.append(&&CommandID&1&/CommandID&&);
xml.append(&&MSISDN&&/MSISDN&&);
xml.append(&&ChargeMSISDN&&/ChargeMSISDN&&);
xml.append(&&SPID&3510127&/SPID&&);
xml.append(&&Code&&/Code&&);
xml.append(&&IDtype&0&/IDtype&&);
xml.append(&&ID&&/ID&&);
xml.append(&&/SSOParas&&);
xml.append(&&/SSOMessage&&);
byte[] xmlbyte = xml.toString().getBytes(&UTF-8&);
System.out.println(xml);
URL url = new URL(&http://118.85.194.28:8080/sotpms_server/GetSSOMessage&);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setDoOutput(true);// 允许输出
conn.setDoInput(true);
conn.setUseCaches(false);// 不使用缓存
conn.setRequestMethod(&POST&);
conn.setRequestProperty(&Connection&, &Keep-Alive&);// 维持长连接
conn.setRequestProperty(&Charset&, &UTF-8&);
conn.setRequestProperty(&Content-Length&,
String.valueOf(xmlbyte.length));
conn.setRequestProperty(&Content-Type&, &text/ charset=UTF-8&);
conn.setRequestProperty(&X-ClientType&, &2&);//发送自定义的头信息
conn.getOutputStream().write(xmlbyte);
conn.getOutputStream().flush();
conn.getOutputStream().close();
if (conn.getResponseCode() != 200)
throw new RuntimeException(&请求url失败&);
InputStream is = conn.getInputStream();// 获取返回数据
// 使用输出流来输出字符(可选)
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1) {
out.write(buf, 0, len);
String string = out.toString(&UTF-8&);
System.out.println(string);
out.close();
// xml解析
String version = null;
String seqID = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new ByteArrayInputStream(string.substring(1)
.getBytes(&UTF-8&)), &UTF-8&);
parser.setInput(is, &UTF-8&);
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (&SSOMessage&.equals(parser.getName())) {
version = parser.getAttributeValue(0);
} else if (&SeqID&.equals(parser.getName())) {
seqID = parser.nextText();
} else if (&ResultCode&.equals(parser.getName())) {
resultCode = parser.nextText();
eventType = parser.next();
} catch (XmlPullParserException e) {
e.printStackTrace();
System.out.println(e);
} catch (IOException e) {
e.printStackTrace();
System.out.println(e);
System.out.println(&version = & + version);
System.out.println(&seqID = & + seqID);
System.out.println(&resultCode = & + resultCode);*/
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e);
阅读(...) 评论()

我要回帖

更多关于 雅虎股票历史数据接口 的文章

 

随机推荐