Android中使用SAX来解析XML
16lz
2021-01-26
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应用开发揭秘》的示例程序改的。
点击下载
更多相关文章
- Android(安卓)自定义xmlns
- Android(安卓)Google Maps 完整实例分析
- Android(安卓)APP - GPS定位并获取地理位置
- 简单好用的控件源码
- Android中通过GPS或NetWork获取当前位置的经纬度
- Android百度地图地位当前位置和城市检索-日记
- android根据经纬度查询位置名称
- android实现省市区三级联动 citypicker 亲测可用效果满意
- 百度Android定位SDK实现获取当前经纬度及位置