Android中使用SAX来解析XML

在Java中使用SAX来解析XML,这样好像耗内存会比DOM方式少些,适合于手持设备上的XML处理。
用SAX处理以下XML文件:
1 <? xmlversion="1.0"encoding="UTF-8" ?>
2 < citys >
3 < city name ="上海" >< long > 121480000 </ long >< lat > 31220000 </ lat ></ city >
4 < city name ="嘉定" >< long > 121240000 </ long >< lat > 31400000 </ lat ></ city >
5 < city name ="宝山" >< long > 121480000 </ long >< lat > 31410000 </ lat ></ city >
6 < city name ="川沙" >< long > 121700000 </ long >< lat > 31190000 </ lat ></ city >
7 < city name ="南汇" >< long > 121760000 </ long >< lat > 31050000 </ lat ></ city >
8 < city name ="奉贤" >< long > 121460000 </ long >< lat > 30920000 </ lat ></ city >
9 < city name ="松江" >< long > 121240000 </ long >< lat > 31000000 </ lat ></ city >
10 < city name ="金山" >< long > 121160000 </ long >< lat > 30890000 </ lat ></ city >
11 < city name ="青浦" >< long > 121100000 </ long >< lat > 31150000 </ lat ></ city >
12 < city name ="崇明" >< long > 121400000 </ long >< lat > 31730000 </ lat ></ city >
13 </ citys >
14 这里用查询指定城市的坐标信息:
1 package sax.test;
2
3 import java.io.IOException;
4
5 import javax.xml.parsers.SAXParser;
6 import javax.xml.parsers.SAXParserFactory;
7
8 import org.xml.sax.Attributes;
9 import org.xml.sax.InputSource;
10 import org.xml.sax.SAXException;
11 import org.xml.sax.XMLReader;
12 import org.xml.sax.helpers.DefaultHandler;
13
14
15 public class CityInfoHandler extends DefaultHandler {
16privatestaticCityInfoHandlerinstance=newCityInfoHandler();
17privateStringtarName="";
18privateStringsubTarName="";
19privateStringcityName="";
20privateLatAndLonglatAndLong=null;
21
22
23publicLatAndLonggetLatAndLong(){
24tarName="";
25cityName="";
26returnlatAndLong;
27}

28
29publicvoidsetCityName(StringcityName){
30this.cityName=cityName;
31}

32
33@Override
34publicvoidstartDocument()throwsSAXException{
35latAndLong=newLatAndLong();
36}

37
38@Override
39publicvoidstartElement(Stringuri,StringlocalName,StringqName,
40Attributesatts)throwsSAXException{
41System.out.println("qName="+qName);
42System.out.println("localName="+localName);
43if("city".equals(qName)){
44Stringcname=atts.getValue("name");
45if(cname.equalsIgnoreCase(cityName)){
46tarName=qName;
47}

48}

49
50if("long".equals(qName)||"lat".equals(qName)){
51subTarName=qName;
52}

53
54}

55
56@Override
57publicvoidcharacters(char[]ch,intstart,intlength)
58throwsSAXException{
59//锟斤拷锟斤拷锟介到锟斤拷
60if(tarName!=""&&tarName.length()>0&&tarName.equals("city")){
61Stringtext=newString(ch,start,length);
62
63if("long".equals(subTarName)){
64latAndLong.setAlong(text);
65}
elseif("lat".equals(subTarName)){
66latAndLong.setAlat(text);
67}

68
69if(latAndLong.isOk()){
70tarName="";
71cityName="";
72}

73
74}

75
76subTarName="";
77
78}

79
80
81
82publicstaticLatAndLongqueryLatAndLong(StringcityName){
83try{
84instance.setCityName(cityName);
85SAXParserFactoryfactory=SAXParserFactory.newInstance();
86SAXParserparser=factory.newSAXParser();
87XMLReaderxr=parser.getXMLReader();
88
89xr.setContentHandler(instance);
90
91xr.parse(newInputSource(ClassLoader.getSystemResourceAsStream("city.xml")));
92returninstance.getLatAndLong();
93}
catch(IOExceptione){
94e.printStackTrace();
95}
catch(SAXExceptione){
96e.printStackTrace();
97}
catch(Exceptione){
98e.printStackTrace();
99}

100
101returnnull;
102
103}

104
105publicstaticvoidmain(String[]args){
106LatAndLongll=queryLatAndLong("上海");
107System.out.println(ll.getAlat()+","+ll.getAlong());
108}

109}

110 1 package sax.test;
2
3 /***/ /**
4*经纬度
5*
6*@authorvaga
7*
8*/

9 public class LatAndLong {
10privateStringalat=null;
11privateStringalong=null;
12
13privatebooleanisOk=false;
14
15publicbooleanisOk(){
16returnisOk;
17}

18
19publicStringgetAlat(){
20returnalat;
21}

22
23publicvoidsetAlat(Stringalat){
24this.alat=alat;
25if(this.alat!=null&&this.along!=null){
26isOk=true;
27}

28}

29
30publicStringgetAlong(){
31returnalong;
32}

33
34publicvoidsetAlong(Stringalong){
35this.along=along;
36if(this.alat!=null&&this.along!=null){
37isOk=true;
38}

39}

40
41}

42 这里需要注意的是public void startElement(String uri, String localName, String qName,Attributes atts) ,这个方法的参数localName和qName,localName是不加Namespace前缀的标签名,而qName是加Namespace前缀的,如果没有指定Namespace,则qName可能为空,当然不同的SAX实现会有所不同,比如在Android中qName为空,而J2SE中localName为空,所以想要总是得到标签名,就需要检查这两个参数的值了。
最后,得到城市的经纬度坐标,可以用经纬度来在Google Weather API中查询天气情况。这里有一个根据输入的中文城市名来查询天气的Android实现,是从《Android应用开发揭秘》的示例程序改的。

点击下载

更多相关文章

  1. Android(安卓)自定义xmlns
  2. Android(安卓)Google Maps 完整实例分析
  3. Android(安卓)APP - GPS定位并获取地理位置
  4. 简单好用的控件源码
  5. Android中通过GPS或NetWork获取当前位置的经纬度
  6. Android百度地图地位当前位置和城市检索-日记
  7. android根据经纬度查询位置名称
  8. android实现省市区三级联动 citypicker 亲测可用效果满意
  9. 百度Android定位SDK实现获取当前经纬度及位置

随机推荐

  1. xUtils,butterknife...处理findviewbyid
  2. 自定义progressbar 的思路
  3. Android(安卓)Studio中模拟器中关于VT-x
  4. 获得SDCard的路径
  5. Android开发入门之学习笔记(四):程序窗口的
  6. android之相机开发
  7. 手动root android 模拟器(emulator)详细
  8. Android开发必备的免费资源和工具
  9. 浅入浅出Android(000):Hello Android
  10. 去掉Android(安卓)USB授权框