天气预报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);
  }
}
}

解决方案 »

  1.   

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

  2.   


    嗯、第一次做xml的解析有些概念性的问题、现在已经理清头绪了。Thank~~
      

  3.   

    有完整代码吗 最近也在做这个 有的话发给我一份 参考下 [email protected]  感激不尽
      

  4.   

    JAVABEAN怎么弄出来的啊?我是菜鸟,javabean是自定义的类吗?怎么定义?