最近接触了网络解析,而解析一般分为xml解析和json解析,xml解析中用的 比较多的则是pull解析。在这几天的接触中,遇到了许多问题,在解决的过程中也颇费周折。现在将一部分内容和解决方案记录下来,方便自己以后查阅,另外希望对新手有一定的帮助。
一、接下来先说下几个个的共同点
1、不管是什么解析首先都需要获得含有需要解析的内容的字符串(xml里面的是InputStream类型),然后来解析。(网络内容可以通过httpget请求来获得,本地的可以通过文件操作读入)
2、将1里面获得数据拿来就可以开始进行解析了 (假设获得的内容为result的变量,类型参考1)
数据源:(模拟网址)
String url="http://weather.xcyh.org/*****";
xml获得数据
//这段代码如果写到工具类中,传输的inputstream类型可能报错,是因为inputstream导包错,确认导入io包下的就对了
InputStream Result=null;
HttpClient httpclient=new DefaultHttpClient();
HttpGet httpget=new HttpGet(url);
HttpResponse response=httpclient.execute(httpget);
int responsecode=response.getStatusLine().getStatusCode();
if(responsecode==200){
HttpEntity entity=response.getEntity();
Result=entity.getContent();
}
json获得数据
String Result=null;
HttpClient httpclient=new DefaultHttpClient();
HttpGet httpget=new HttpGet(url);
try {
HttpResponse response=httpclient.execute(httpget);
int responseCode=response.getStatusLine().getStatusCode();
if(responseCode==200){
HttpEntity entity=response.getEntity();
Result=EntityUtils.toString(entity);
}else{
Result="";
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
3、根据获得的数据,生成解析内容的操作对象
xml获得解析内容的操作对象
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser parser=factory.newPullParser();
InputStream in=xmlpulltools.getxmldate.getXmlData(url);
parser.setInput(in, "utf-8");
JSON获得解析内容的操作对象
//最外层的标签是这样的 {*****}
JSONObject obj=new JSONObject(Result);
//最外层的标签是这样的 [******]
JSONArray objArray=new JSONArray(Result);
在json中,内层需要获得操作对象的时候,需要上一层级的操作对象根据需要来调用getJSONObject(key);和getJSONArray(key);来生成。
JSONObject zobj=obj(或者objArray).getJSONObject(key);
JSONArray zobjArray=obj(或者objArray).getJSONArray(key);
4、根据要解析的内容生成实体类的对象
5、解析
二、解析中的一些问题及解决办法
1、xmlpull解析中的gettext(); 和nexttext(); 的用法区别
a 、<b b_id="12">lady</d> 注意:"lady"可以是空
在解析的过程中当前位置是XmlPullParser.START_TAG 的时候,可以通过nexttext();获得lady,但是</d>将会被跳过,不会被位置标签标记即XmlPullParser.END_TAG下不会出现d;如果用gettext();方法,此时无法获得lady,将获得空值。可以在
XmlPullParser.TEXT下使用gettext();此时不但可以获得lady,并且不会跳过结束标签,下次的当前标签就是</d>
2、json中的问题及解决:
["key"] not found 说明没有找到该关键字,有可能自己写成了关键字,还有一种情况就是有时候获得的json里,有几个对象存在该关键字,有些没有该关键字。 解决方案就是在生成该对象前进行判断。
if(obj.has("vid")){
fc.setVid(fobj.getString("vid"));
}
3、json生成对象的规律
{}创建实体类对象
[{},{}]创建实体类数组
["","",]创建字符串数组
一、接下来先说下几个个的共同点
1、不管是什么解析首先都需要获得含有需要解析的内容的字符串(xml里面的是InputStream类型),然后来解析。(网络内容可以通过httpget请求来获得,本地的可以通过文件操作读入)
2、将1里面获得数据拿来就可以开始进行解析了 (假设获得的内容为result的变量,类型参考1)
数据源:(模拟网址)
String url="http://weather.xcyh.org/*****";
xml获得数据
//这段代码如果写到工具类中,传输的inputstream类型可能报错,是因为inputstream导包错,确认导入io包下的就对了
InputStream Result=null;
HttpClient httpclient=new DefaultHttpClient();
HttpGet httpget=new HttpGet(url);
HttpResponse response=httpclient.execute(httpget);
int responsecode=response.getStatusLine().getStatusCode();
if(responsecode==200){
HttpEntity entity=response.getEntity();
Result=entity.getContent();
}
json获得数据
String Result=null;
HttpClient httpclient=new DefaultHttpClient();
HttpGet httpget=new HttpGet(url);
try {
HttpResponse response=httpclient.execute(httpget);
int responseCode=response.getStatusLine().getStatusCode();
if(responseCode==200){
HttpEntity entity=response.getEntity();
Result=EntityUtils.toString(entity);
}else{
Result="";
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
3、根据获得的数据,生成解析内容的操作对象
xml获得解析内容的操作对象
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser parser=factory.newPullParser();
InputStream in=xmlpulltools.getxmldate.getXmlData(url);
parser.setInput(in, "utf-8");
JSON获得解析内容的操作对象
//最外层的标签是这样的 {*****}
JSONObject obj=new JSONObject(Result);
//最外层的标签是这样的 [******]
JSONArray objArray=new JSONArray(Result);
在json中,内层需要获得操作对象的时候,需要上一层级的操作对象根据需要来调用getJSONObject(key);和getJSONArray(key);来生成。
JSONObject zobj=obj(或者objArray).getJSONObject(key);
JSONArray zobjArray=obj(或者objArray).getJSONArray(key);
4、根据要解析的内容生成实体类的对象
5、解析
二、解析中的一些问题及解决办法
1、xmlpull解析中的gettext(); 和nexttext(); 的用法区别
a 、<b b_id="12">lady</d> 注意:"lady"可以是空
在解析的过程中当前位置是XmlPullParser.START_TAG 的时候,可以通过nexttext();获得lady,但是</d>将会被跳过,不会被位置标签标记即XmlPullParser.END_TAG下不会出现d;如果用gettext();方法,此时无法获得lady,将获得空值。可以在
XmlPullParser.TEXT下使用gettext();此时不但可以获得lady,并且不会跳过结束标签,下次的当前标签就是</d>
2、json中的问题及解决:
["key"] not found 说明没有找到该关键字,有可能自己写成了关键字,还有一种情况就是有时候获得的json里,有几个对象存在该关键字,有些没有该关键字。 解决方案就是在生成该对象前进行判断。
if(obj.has("vid")){
fc.setVid(fobj.getString("vid"));
}
3、json生成对象的规律
{}创建实体类对象
[{},{}]创建实体类数组
["","",]创建字符串数组