`
hbczzsw
  • 浏览: 42716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XML SAX解析

阅读更多
*****************************天气预报的实现****************************
代码:
public class WeatherReport extends Activity {
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.weather);      
        init();
    }
    private void init(){
    Spinner city_spr = (Spinner)findViewById(R.id.Spinner01);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_spinner_item, ConstData.city);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    city_spr.setAdapter(adapter);
    Button submit = (Button) findViewById(R.id.Button01);
        submit.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Spinner spr = (Spinner)findViewById(R.id.Spinner01);
//获得下拉项的索引值
Long l = spr.getSelectedItemId();
int index = l.intValue();
//取出所选城市的坐标
String cityParamString = ConstData.cityCode[index];
try {
URL url = new URL(ConstData.queryString+cityParamString);
SAXParserFactory spf = SAXParserFactory.newInstance();
                    SAXParser sp = spf.newSAXParser();
                    XMLReader xr = sp.getXMLReader();
                    GoogleWeatherHandler gwh = new GoogleWeatherHandler();
                    xr.setContentHandler(gwh);
                    InputStreamReader isr =new InputStreamReader(url.openStream(),"GBK");
                    InputSource is=new InputSource(isr);
                    xr.parse(is);
                    WeatherSet ws = gwh.getMyWeatherSet();
                    updateWeatherInfoView(R.id.weather_0,ws.getMyCurrentCondition());
                    updateWeatherInfoView(R.id.weather_1,ws.getMyForecastConditions().get(0));
                    updateWeatherInfoView(R.id.weather_2,ws.getMyForecastConditions().get(1));
                    updateWeatherInfoView(R.id.weather_3,ws.getMyForecastConditions().get(2));
                    updateWeatherInfoView(R.id.weather_4,ws.getMyForecastConditions().get(3));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
        });
    }
    private void updateWeatherInfoView(int aResourceID,WeatherCurrentCondition aWCC) throws MalformedURLException {
        URL imgURL = new URL("http://www.google.com/" + aWCC.getIcon());
        ((SingleWeatherInfoView) findViewById(aResourceID)).setWeatherIcon(imgURL);
        ((SingleWeatherInfoView) findViewById(aResourceID)).setWeatherString(aWCC.toString());
    }
    private void updateWeatherInfoView(int aResourceID,WeatherForecastCondition aWFC) throws MalformedURLException {
        URL imgURL = new URL("http://www.google.com/" + aWFC.getIcon());
        ((SingleWeatherInfoView) findViewById(aResourceID)).setWeatherIcon(imgURL);
        ((SingleWeatherInfoView) findViewById(aResourceID)).setWeatherString(aWFC.toString());
    }
}

************************xml 的sax解析代码***************************

public class GoogleWeatherHandler extends DefaultHandler {

private WeatherSet myWeatherSet = null;

private boolean is_Current_Conditions = false;
    private boolean is_Forecast_Conditions = false;
//    private final String FORECAST_INFORMATION="forecast_information";
    private final String CURRENT_CONDITIONS="current_conditions";
    private final String FORECAST_CONDITIONS="forecast_conditions";
   
    public GoogleWeatherHandler(){
   
    }

public WeatherSet getMyWeatherSet() {
Log.i("igwh", " getMyWeatherSet");
return myWeatherSet;
}

@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}

@Override
public void endElement(String uri, String localName, String name)
throws SAXException {

if(localName.equals(CURRENT_CONDITIONS)){
this.is_Current_Conditions = false;
}else if(localName.equals(FORECAST_CONDITIONS)){
this.is_Forecast_Conditions = false;
}
}

@Override
public void startDocument() throws SAXException {
this.myWeatherSet = new WeatherSet();
}

@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
if(localName.equals(CURRENT_CONDITIONS)){
Log.i("localName+CURRENT", localName);
this.myWeatherSet.setMyCurrentCondition(new WeatherCurrentCondition());
Log.i("localName+CURRENT+1", localName);
this.is_Current_Conditions = true;
}else if(localName.equals(FORECAST_CONDITIONS)){
this.myWeatherSet.getMyForecastConditions().add(new WeatherForecastCondition());
this.is_Forecast_Conditions = true;
}else{
if(localName.equals(CURRENT_CONDITIONS)){
Log.i("localName+CURRENT", localName);
}
String dataAttribute = attributes.getValue("data");
//Shared Tags
if(localName.equals("icon")){
if(this.is_Current_Conditions){
this.myWeatherSet.getMyCurrentCondition().setIcon(dataAttribute);
}else if(this.is_Forecast_Conditions){
this.myWeatherSet.getLastForecastCondition().setIcon(dataAttribute);
}
}else if(localName.equals("condition")){
if(this.is_Current_Conditions){
this.myWeatherSet.getMyCurrentCondition().setCondition(dataAttribute);
}else if(this.is_Forecast_Conditions){
this.myWeatherSet.getLastForecastCondition().setCondition(dataAttribute);
}
}//Tags is current_conditions
else if(localName.equals("temp_c")){
this.myWeatherSet.getMyCurrentCondition().setTemp_celcius(dataAttribute);
}else if(localName.equals("humidity")){
this.myWeatherSet.getMyCurrentCondition().setHumidity(dataAttribute);
}else if(localName.equals("wind_condition")){
this.myWeatherSet.getMyCurrentCondition().setWind_condition(dataAttribute);
}//Tags is forecast_conditions
else if(localName.equals("day_of_week")){
this.myWeatherSet.getLastForecastCondition().setDay_of_week(dataAttribute);
}else if(localName.equals("low")){
this.myWeatherSet.getLastForecastCondition().setLow(dataAttribute);
}else if(localName.equals("high")){
this.myWeatherSet.getLastForecastCondition().setHigh(dataAttribute);
}
}

}
@Override
    public void characters(char ch[], int start, int length) {
         /*
          * Would be called on the following structure: <element>characters</element>
          */
    }

}

************************界面的xml代码实现******************************

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg">
<TableLayout
android:id="@+id/TableLayout02"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TableRow
android:id="@+id/TableRow01"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/msg"
android:textStyle="bold"
android:textSize="16px"
android:layout_marginLeft="10px"
android:textColor="@color/black">
</TextView>
<Spinner
android:id="@+id/Spinner01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingLeft="10px"
android:minWidth="200px">
</Spinner>
<Button
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/OK"
android:paddingLeft="10px">
</Button>
</TableRow>
</TableLayout>

<TableLayout
android:id="@+id/TableLayout01"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TableRow
android:id="@+id/TableRow02"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow
android:id="@+id/TableRow03"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow
android:id="@+id/TableRow04"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow
android:id="@+id/TableRow05"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow
android:id="@+id/TableRow06"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
</TableLayout>
</LinearLayout>

**********************************************************
在界面的xml代码中有com.dudo.weather.views.SingleWeatherInfoView,该实现方式为代码实现,定义了当天与未来几天的天气显示布局,代码如下:

public class SingleWeatherInfoView extends LinearLayout{

private ImageView myWeatherImageView = null;
    private TextView myTempTextView = null;
   
    public SingleWeatherInfoView(Context context){
    super(context);
    }
public SingleWeatherInfoView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.myWeatherImageView = new ImageView(context);
this.myWeatherImageView.setPadding(10, 5, 5, 5);

this.myTempTextView = new TextView(context);
this.myTempTextView.setTextColor(Color.GREEN);
this.myTempTextView.setTextSize(16);

this.addView(this.myWeatherImageView, new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
this.addView(this.myTempTextView, new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}

public void setWeatherString(String aWeatherString) {
this.myTempTextView.setText(aWeatherString);
}
public void setWeatherIcon(URL aURL) {
try{
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
Bitmap bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
this.myWeatherImageView.setImageBitmap(bm);
}catch(Exception e){

}

}

}
分享到:
评论

相关推荐

    xml sax解析

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式处理XML文档,相较于DOM(Document Object Model)解析器,SAX解析更加轻量级和高效。 SAX解析的核心思想是读取XML文档时,每当遇到一个元素、...

    xmlSAX 解析

    java xmlSAX 解析,简单易使用。

    sax解析xml文件

    相较于DOM(Document Object Model)解析器,SAX解析器占用更少的内存和处理时间,因为它不会一次性加载整个XML文档到内存,而是采用事件驱动的方式逐个处理XML元素。在本项目中,"saxloadxml"应该是实现了一个SAX...

    Sax解析XML文件解析

    SAX解析器以流式的方式读取XML文档,当遇到文档的各个元素时,会触发相应的事件,如开始文档、开始元素、结束元素、字符数据等。程序员通过实现SAX解析器的回调接口来处理这些事件,从而解析XML内容。这种方式使得...

    SAX解析XML文件实例

    SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...

    android----xml Sax解析示例

    SAX解析的基本原理是,当解析器读取XML文档时,遇到每个元素、属性或其他XML结构,都会触发一个特定的事件,开发者可以通过实现SAX解析器的事件接口来响应这些事件。这种方式对比DOM解析(将整个XML文档加载到内存中...

    Java SAX解析Xml文档Demo

    本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...

    Sax解析xml文件

    SAX解析器的工作原理是基于事件驱动的,它在解析XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素等。开发者通过实现SAX解析器的回调接口(如ContentHandler),在这些事件发生时执行相应的...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    本压缩包文件“XML-java.rar”包含了关于使用Java解析XML的实例,特别强调了SAX解析器的使用,并且提到了使用JDOM和JOM4J这两个Java库来处理XML。 1. **DOM解析**:DOM是一种树型结构,它将整个XML文档加载到内存中...

    XML解析之SAX解析DEMO

    SAX解析是一种基于事件驱动的解析方式,它不会一次性加载整个XML文档到内存,而是逐行读取,当遇到XML文档中的特定事件(如开始元素、结束元素、字符数据等)时,会触发相应的回调函数。这种解析方式适用于处理大型...

    Servlet利用SAX解析XML文档

    本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 首先,我们需要了解SAX解析的基本原理。SAX解析器不创建整个XML文档树,而是当遇到XML文档的各个部分(如元素、属性、文本等)时,触发相应的事件回调函数。...

    java解析xml数据---sax解析器

    SAX解析的基本工作原理是通过事件处理器(如ContentHandler、EntityResolver等)来接收XML文档的解析事件,如开始文档、结束文档、开始元素、结束元素、字符数据等。当解析器遇到这些事件时,会调用相应的处理器方法...

    sax解析xml尤其是获取元素的值或者内容

    本文将深入探讨如何使用SAX解析XML并获取元素的值或内容。 首先,SAX解析器以流式方式读取XML文档,当遇到文档的不同部分时,会触发相应的事件,如开始文档、开始元素、结束元素等。开发者可以注册事件处理器来响应...

    XML通过sax解析JSON格式

    标题中提到的"XML通过SAX解析为JSON格式"是指使用SAX解析器来读取XML文档,并将其转换成等效的JSON对象。SAX解析器以流式方式处理XML,当遇到文档的不同部分(如开始标签、结束标签、文本节点等)时,会触发相应的...

    SAX解析超大XML文件 示例代码

    SAX解析器逐行读取XML文件,只在需要时处理数据,显著降低了内存需求。 SAX解析的核心在于事件驱动模型。当解析器读取XML文件时,遇到开始元素、结束元素、字符数据等,它会触发相应的事件,并调用预先注册的处理器...

    dom解析和sax解析

    相比之下,SAX解析采用了事件驱动的方式,它不是将整个XML文档加载到内存中,而是逐行扫描XML文件,遇到元素开始、结束、属性等事件时触发相应的回调函数。例如,对于上述XML,SAX解析器会依次调用startElement、...

    sax解析xml本地读取xml

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...

    android使用SAX解析xml

    本篇文章将详细介绍如何在Android环境中使用SAX解析器来处理从网络获取的XML文件。 1. **XML与SAX解析基础** - XML是一种结构化的文本数据表示方式,它定义了标签、属性等规则,使数据具有自解释性。 - SAX解析器...

Global site tag (gtag.js) - Google Analytics