Android中使用SAX来解析XML

     在Java中使用SAX来解析XML,这样好像耗内存会比DOM方式少些,适合于手持设备上的XML处理。
    用SAX处理以下XML文件:
  
 1 <? xml version="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  {
 16    private static  CityInfoHandler instance = new CityInfoHandler();
 17    private String tarName = "";
 18    private String subTarName = "";
 19    private String cityName = "";
 20    private LatAndLong latAndLong = null;
 21    
 22
 23    public LatAndLong getLatAndLong() {
 24        tarName = "";
 25        cityName = "";
 26        return latAndLong;
 27    }

 28
 29    public void setCityName(String cityName) {
 30        this.cityName = cityName;
 31    }

 32
 33    @Override
 34    public void startDocument() throws SAXException {
 35        latAndLong = new LatAndLong();
 36    }

 37    
 38    @Override
 39    public void startElement(String uri, String localName, String qName,
 40            Attributes atts) throws SAXException {
 41        System.out.println("qName = "+ qName);
 42        System.out.println("localName = " + localName);
 43        if ("city".equals(qName)) {
 44            String cname = atts.getValue("name");
 45            if(cname.equalsIgnoreCase(cityName)){
 46                tarName = qName;
 47            }

 48        }

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

 53        
 54    }

 55
 56    @Override
 57    public void characters(char[] ch, int start, int length)
 58            throws SAXException {
 59        // 锟斤拷锟斤拷锟介到锟斤拷
 60        if(tarName != "" && tarName.length() > 0 && tarName.equals("city")){
 61            String text = new String(ch, start, length);
 62            
 63            if("long".equals(subTarName)){
 64                latAndLong.setAlong(text);
 65            }
else if("lat".equals(subTarName)){
 66                latAndLong.setAlat(text);
 67            }

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

 73            
 74        }

 75        
 76        subTarName = "";
 77        
 78    }

 79    
 80    
 81    
 82    public static LatAndLong queryLatAndLong(String cityName){
 83        try {
 84            instance.setCityName(cityName);
 85            SAXParserFactory factory = SAXParserFactory.newInstance();
 86            SAXParser parser = factory.newSAXParser();
 87            XMLReader xr = parser.getXMLReader();
 88            
 89            xr.setContentHandler(instance);    
 90            
 91            xr.parse(new InputSource(ClassLoader.getSystemResourceAsStream("city.xml")));
 92            return instance.getLatAndLong();
 93        }
 catch (IOException e) {
 94            e.printStackTrace();
 95        }
 catch (SAXException e) {
 96            e.printStackTrace();
 97        }
 catch (Exception e) {
 98            e.printStackTrace();
 99        }

100        
101        return null;
102        
103    }

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

109}

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

 9 public  class LatAndLong  {
10    private String alat = null;
11    private String along = null;
12    
13    private boolean isOk = false;
14
15    public boolean isOk() {
16        return isOk;
17    }

18
19    public String getAlat() {
20        return alat;
21    }

22
23    public void setAlat(String alat) {
24        this.alat = alat;
25        if(this.alat != null && this.along != null){
26            isOk = true;
27        }

28    }

29
30    public String getAlong() {
31        return along;
32    }

33
34    public void setAlong(String along) {
35        this.along = along;
36        if(this.alat != null && this.along != null){
37            isOk = 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应用开发揭秘》的示例程序改的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值