android利用SAX解析xml(以解析谷歌天气预报xml预报为例)

2023-10-29

package com.mars.android;

import java.io.BufferedInputStream;

import java.io.InputStream;

import java.net.URL;

import java.net.URLConnection;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;

import org.xml.sax.XMLReader;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ImageView;

import android.widget.TextView;

public class CurrentWeather extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button submit=(Button)findViewById(R.id.submit);

submit.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

/*从google上获得图标*/

try{

String city=((EditText)findViewById(R.id.cityname))

.getText().toString().trim();

String querystr="http://www.google.com/ig/api?weather="+city;

URL aURL=new URL(querystr.replace(" ", "%20"));

/*从SAXParserFactory中获取SAXParser*/

Log.v("querystr",querystr);

Log.v("querystr", querystr.replace(" ", "%20"));

/*创建一个SAXParserFactory对象*/

SAXParserFactory spf=SAXParserFactory.newInstance();

/*利用SAXParserFactory对象spf的newSAXParser()方法生成一个SAXParser对象*/

SAXParser sp=spf.newSAXParser();

XMLReader xr=sp.getXMLReader();//从SAXParser中得到XMLReader

/*创建一个解析xml文件的GoogleWeatherHandler对象gwh*/

GoogleWeatherHandler gwh=new GoogleWeatherHandler();

/*设定XMLReader类的xml处理对象*/

xr.setContentHandler(gwh);

/*解析XML文件内容*/

xr.parse(new InputSource(aURL.openStream()));

/*下面进行图片的请求 并生成一幅bmp图像*/

URL iconurl=new URL("http://www.google.com"+gwh.getIconURL());

URLConnection conn= iconurl.openConnection();

conn.connect();

//获得图像的字符流

InputStream is=conn.getInputStream();

BufferedInputStream bis=new BufferedInputStream(is,8192);

ImageView iv=(ImageView)findViewById(R.id.iconofwheather);

Bitmap bm=null;//生成了一张bmp图像

bm=BitmapFactory.decodeStream(bis);

bis.close();

is.close();//关闭流

System.out.println(bm.getHeight());

iv.setImageBitmap(bm);

TextView tv1=(TextView)findViewById(R.id.condition);

tv1.append(gwh.getCurrent_condition());

TextView tv2=(TextView)findViewById(R.id.temperature);

tv2.append(gwh.getCurrent_temp().toString()+"摄氏度");

TextView tv3=(TextView)findViewById(R.id.humidity);

tv3.append(gwh.getCurrent_hum().replace("Humidity", ""));

System.out.println(tv1.getText().toString());

System.out.println(tv2.getText().toString());

System.out.println(tv3.getText().toString());

}

catch(Exception e){

Log.e("error", e.toString());

}

}

});

}

}

上面是一个activity用于显示解析xml得出的内容。下面是一个继承自DefaultHandler的类 专门用于处理XML

package com.mars.android;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

public class GoogleWeatherHandler extends DefaultHandler{

private boolean in_forecast_information = false;

private boolean in_current_conditions = false;

private boolean in_forecast_conditions = false;

private Integer current_temp;

private String current_condition;

private String current_hum;

private String iconURL;

// private String forecast_date;

private boolean usingSITemperature = false; // false为华氏度,true为摄氏度

public Integer getCurrent_temp() {

return current_temp;

}

public void setCurrent_temp(Integer currentTemp) {

current_temp = currentTemp;

}

public String getCurrent_condition() {

return current_condition;

}

public void setCurrent_condition(String currentCondition) {

current_condition = currentCondition;

}

public String getCurrent_hum() {

return current_hum;

}

public void setCurrent_hum(String currentHum) {

current_hum = currentHum;

}

public String getIconURL() {

return iconURL;

}

public void setIconURL(String iconURL) {

this.iconURL = iconURL;

}

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

}

@Override

public void endDocument() throws SAXException {

}

@Override

public void endElement(String uri, String localName, String qName)

throws SAXException {

// TODO Auto-generated method stub

if (localName.equals("forecast_information")) {

this.in_forecast_information = false;

} else if (localName.equals("current_conditions")) {

this.in_current_conditions = false;

} else if (localName.equals("forecast_conditions")) {

this.in_forecast_conditions = false;

}

}

@Override

public void startDocument() throws SAXException {

// TODO Auto-generated method stub

// super.startDocument();

}

@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

// TODO Auto-generated method stub

if (localName.equals("forecast_information")) {

this.in_forecast_information = true;

} else if (localName.equals("current_conditions")) {

this.in_current_conditions = true;

} else if (localName.equals("forecast_conditions")) {

this.in_forecast_conditions = true;

} else {

String dataAttribute = attributes.getValue("data");

// 'Inner' Tags of "<forecast_information>"

if (localName.equals("city")) {

} else if (localName.equals("postal_code")) {

} else if (localName.equals("latitude_e6")) {

/* One could use this to convert city-name to Lat/Long. */

} else if (localName.equals("longitude_e6")) {

/* One could use this to convert city-name to Lat/Long. */

} else if (localName.equals("forecast_date")) {

} else if (localName.equals("current_date_time")) {

} else if (localName.equals("unit_system")) {

if (dataAttribute.equals("SI"))

this.usingSITemperature = true;

}

// SHARED(!) 'Inner' Tags within "<current_conditions>" AND

// "<forecast_conditions>"

else if (localName.equals("day_of_week")) {

if (this.in_current_conditions) {

//可扩展

} else if (this.in_forecast_conditions) {

//可扩展

}

} else if (localName.equals("icon")) {

if (this.in_current_conditions) {

this.setIconURL(dataAttribute);

} else if (this.in_forecast_conditions) {

//可扩展

}

} else if (localName.equals("condition")) {

if (this.in_current_conditions) {

this.setCurrent_condition(dataAttribute);

} else if (this.in_forecast_conditions) {

//可扩展

}

}

// 'Inner' Tags within "<current_conditions>"

else if (localName.equals("temp_f")) {

//this.setCurrentTemp(Integer.parseInt(dataAttribute));

} else if (localName.equals("temp_c")) {

this.setCurrent_temp(Integer.parseInt(dataAttribute));

} else if (localName.equals("humidity")) {

this.setCurrent_hum(dataAttribute);

} else if (localName.equals("wind_condition")) {

//可扩展

}

// 'Inner' Tags within "<forecast_conditions>"

else if (localName.equals("low")) {

int temp = Integer.parseInt(dataAttribute);

if (this.usingSITemperature) {

//可扩展

} else {

//可扩展

}

} else if (localName.equals("high")) {

//int temp = Integer.parseInt(dataAttribute);

if (this.usingSITemperature) {

//可扩展

} else {

//可扩展

}

}

}

}

}

另外 需要在Manifest.xml中加入INTERNET权限
在application节点后加上<uses-permission android:name="android.permission.INTERNET" />

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android利用SAX解析xml(以解析谷歌天气预报xml预报为例) 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • 简单修改,让CI支持memcache

    CI默认只支持memcaced 今天在网上搜索了下 一些解决方案都是错的 经过ci源代码分析 给出一个正确的解决方案 1 复制driver目录下的memcachd php为memcache php 并且将memcached替换为memcac
  • Altium designer第二屏幕导致的问题

    由于之前笔记本电脑通过VGA线连接第二屏幕使用 但是在一些情况下第二屏幕不在 但是打开Altium designer相关窗口后还默认在第二屏幕 导致软件无法操作 解决方法 1 当Altium Designer 的某一窗口跑到另外一个显示屏上
  • 停用词(stop words)+TF-IDF实现

    一 什么是停用词 在汉语中 有一类没有实际意义的词语 比如组词 的 连词 以及 副词 甚至 语气词 吧 被称为停用词 一个句子去掉这些停用词 并不影响理解 所以 进行自然语言处理时 一般将停用词过滤掉 一般词表文件中每一行存储一个停用词 行
  • Linux版的CASTEP功能更强大,castep在linux下的安装步骤.docx

    castep在linux下的安装步骤 卸载 一 MS卸载 1 首先进入home msi Accelrys Materials Studio40 etc Gateway然后执行 msgateway control 18888 stop 即停掉
  • 服务器无法登录之迷——login界面无限循环

    本周遇到了一个很奇葩的问题 客户的一台服务器无论如何都无法登录到机器系统里面去 可以肯定的是输入的登录密码是完全正确的 但是输入密码后 总在login登录界面无限循环 今天抽空总结下这个问题的前因后果 登录异常现象 1 ssh登录成功后 会
  • vue项目页面进行数据更新的三种方法

    1 场景 在处理列表时 常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求 2 遇到的问题 用vue router重新路由到当前页面 页面是不进行刷新的 3 采用window reload 或者router go 0 刷新时 整个
  • mysql 误删binlog_mysql binlog日志 误删数据 用于恢复数据

    1 binlog 日志打开方法 在my cnf这个文件中加一行 Windows为my ini vi etc my cnf mysqld log bin mysqlbin log 添加这一行就ok了 号后面的名字自己定义吧 然后我们可以对数据
  • Linux线程

    目录 线程概念 原生线程库pthread 线程的优点 线程的缺点 线程异常 线程用途 Linux进程VS线程 Linux线程控制 创建线程 获取线程ID 线程ID及进程地址空间布局 线程等待 线程终止 线程取消 分离线程 线程概念 什么是线
  • VM虚拟机下添加一个硬盘

    VM虚拟机下添加一个硬盘 一 新建虚拟硬盘 打开VMware 选择菜单 VM gt settings gt Add gt 下一步 gt 选择 Harddisk 点 下一步 gt 选 creat a new virtual disk 点 下一
  • 三大抽样分布:卡方分布,t分布和F分布的简单理解

    有很多统计推断是基于正态分布的假设 以标准正态分布变量为基石而构造的三个著名统计量在实际中有广泛的应用 这是因为这三个统计量不仅有明确背景 而且其抽样分布的密度函数有显式表达式 它们被称为统计中的 三大抽样分布 这三大抽样分布即为著名的卡方
  • C、C++写二进制数据到mysql的Blob字段/插入images

    引子 由于调试需要 需直接往数据库里写入二进制数据 本来这些数据是由上层软件来写的 用的是C 为了熟悉C语言的数据库操作 还是决定用C来写这段调试代码 概况 表名 Task 涉及的字段及属性 NumDest int 11 用于存储目标数目
  • 希沃展台如何使用_技术培训

    信息技术应用培训 第五代希沃白板学科应用讲解 一支粉笔勾画五湖四海 一杆教鞭指点千秋万代 这是对教师这个职业的描绘 而随着社会的进步 教育教学改革的不断深入 一支粉笔一块黑板的时代已经离我们远去 现代化的教学设施正随着改革的浪潮涌入到教学当
  • shell判断一个文件夹是否为空,文件是否存在

    文件夹是否为空 dir path xxx if d 1 then 判断文件夹是否为空 if ls A 1 then echo 文件夹为空 else echo 文件夹不为空 fi else echo 文件夹不存在 fi d 判断文件夹是否存在
  • JavaScript题库

    1 下面语句得到值为true的有 A C A 1 1 B 1 1 C 2 gt 19 D 2 19 2 下面哪些方法可以实现将字符串 123 变成数值型 A B C D A Number B parseInt C parseFloat D
  • python:Anaconda安装mlxtend库

    步骤 进入Anaconda Powershell Prompt Acaconda 管理者模式 gt 键入 pip install mlxtend gt over 就这么简单 为嘛要写出来呢 因为我在安装的时候忘记联网啦 QAQ 一直失败 所
  • vue3 + threejs 实现仿iView官网大波浪特效

    一 效果图 先上最终效果图 具体效果可参考iview官方界面iView 一套高质量的UI组件库 大波浪效果 使用的是three js的官方例子 需要先安装three js支持 具体可以看官方实例 three js examples thre
  • linux查询mysql内存使用率_Linux查看CPU和内存使用情况方法总结

    在做Linux系统优化的时候 物理内存是其中最重要的一方面 自然的 Linux也提供了非常多的方法来监控宝贵的内存资源的使用情况 下面的清单详细的列出了Linux系统下通过视图工具或命令行来查看内存使用情况的各种方法 1 proc memi
  • 【ICCV2023】Robustifying Token Attention for Vision Transformers

    Robustifying Token Attention for Vision Transformers 论文 https arxiv org abs 2303 11126 代码 暂未开源 解读 ICCV 2023 Token过度聚焦暴露注
  • Topaz Video Enhance AI中文版

    教程 1 下载解压 双击运行 VideoEnhanceAI windows x64 installer exe 进入安装向导 2 勾选我接受许可协议 3 选择安装目录 也可以选择默认安装 4 安装完成 先不要运行软件 退出向导 5 将文件夹
  • android利用SAX解析xml(以解析谷歌天气预报xml预报为例)

    package com mars android import java io BufferedInputStream import java io InputStream import java net URL import java n