首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android天气预报 sax解析报错,该如何解决

2013-08-04 
android天气预报 sax解析报错天气预报API地址:http://www.webxml.com.cn/WebServices/WeatherWebService.a

android天气预报 sax解析报错

天气预报API地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=beijing

<?xml version="1.0" encoding="utf-8" ?> - <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
<string>直辖市</string> 

<string>北京</string> 

<string>54511</string> 

。。。。。

</ArrayOfString>

整个天气预报的XML只有一个<string>元素,代码看了很久感觉没什么问题,onclick后报异常。后来单步调试运行发现 执行完第一次startElement后立马就报错了。DEBUG视图 弹出一个ExpatParser.startElement(。。。)的标签页 内部标注了一行文本“Source not found.”
我这个代码应该怎么改~~真心不知道怎么办了



WeatherReport.java
=================
public class WeatherReport extends Activity implements OnClickListener {
private static final String WEATHER_API_URL = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=";
private static final String NETWORK_ERROR = "网络异常";
private EditText weather_city_edit;
private Button goQuery;
private TextView city;
private TextView weather;
private TextView wendu;
private ImageView imgweather;

private String info="info";
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  city=(TextView) findViewById(R.id.city);
  weather=(TextView) findViewById(R.id.weather);
  wendu=(TextView) findViewById(R.id.wendu);
  imgweather=(ImageView) findViewById(R.id.imgweather);
  weather_city_edit = (EditText) findViewById(R.id.weather_city_edit);
  goQuery = (Button) findViewById(R.id.goQuery);
  goQuery.setOnClickListener(this);
  
}
public void onClick(View v) {
  // 获得用户输入的城市名称
  Log.i(info,"onClick");
  String cityname = weather_city_edit.getText().toString().trim();
  String resultStr=WEATHER_API_URL + cityname;
  
  try {
   // 构建SAXParser
   
   URL url = new URL(resultStr);
   javaBean javabean=new javaBean();
   System.out.println(resultStr);
   SAXParserFactory factory = SAXParserFactory.newInstance();  //创建一个SAX工厂
   SAXParser parser = factory.newSAXParser();


   XMLReader xmlreader = parser.getXMLReader();     //创建一个SAX解析器
   SaxParseXml saxparsexml = new SaxParseXml();
   xmlreader.setContentHandler(saxparsexml);    //设置内容处理器,根据参数来调用特定类来处理各阶段的解析事件
   xmlreader.parse(new InputSource(url.openStream()));//执行解析器解析
   
   city.setText(javabean.getCity().toString());
   weather.setText(javabean.getWeather().toString());
   wendu.setText(javabean.getWendu().toString());

} catch (ParserConfigurationException e) {
   e.printStackTrace();
  } catch (SAXException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
}



SaxParseXml.java
=======================
package com.skyfors;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
public class SaxParseXml extends DefaultHandler {
// 存放遍历集合
private List<javaBean> list;
// 构建 对象
private javaBean javaBean;
// 用来存放每次遍历后的元素名称(节点名称)
private String tagName;
private int i;
private String info="info";
public List<javaBean> getList() {
  return list;
}
public void setList(List<javaBean> list) {
  this.list = list;
}
public javaBean getjavaBean() {
  return javaBean;
}
public void setjavaBean(javaBean javaBean) {
  this.javaBean = javaBean;
}
public String getTagName() {
  return tagName;
}
public void setTagName(String tagName) {
  this.tagName = tagName;
}
// 只调用一次 初始化list集合
@Override
public void startDocument() throws SAXException {
  list = new ArrayList<javaBean>();
  Log.i(info, "开始文档解析");
}
// 调用多次 开始解析
@Override
public void startElement(String uri, String localName, String qName,
   Attributes attributes) throws SAXException {
  switch (i) {
  case 2:
   javaBean.setCity(localName);


   break;
  case 6:
   javaBean.setWendu(localName);
   break;
  case 7:
   javaBean.setWeather(localName);
   break;
  case 10:
   javaBean.setImgweather(localName);
   break;
  }
  this.tagName = qName;
  Log.i(info, "解析元素 "+tagName);
  i++;
}
// 调用多次
@Override
public void endElement(String uri, String localName, String qName)
   throws SAXException {
//  if (qName.equals("javaBean")) {
//   this.list.add(this.javaBean);
//  }
  this.tagName = null;
}
// 只调用一次
@Override
public void endDocument() throws SAXException {
  Log.i(info, "文档解析完毕");
}
// 调用多次
@Override
public void characters(char[] ch, int start, int length)
   throws SAXException {
  if (this.tagName != null) {
   String date = new String(ch, start, length);
  }
}
}


[解决办法]
// 调用多次
@Override
public void characters(char[] ch, int start, int length)
  throws SAXException {
  if (this.tagName != null) {
  String date = new String(ch, start, length);
  }
}
} 这一句有问题,应该将每次的数据追加到数据上一次的历史上.当判断没有数据时,可以清除掉.

热点排行