简体   繁体   中英

xml parsing data from child tags using sax parser

I'm new to android so if I'm asking something stupid so I'm sorry for that. I'm working with the weather parsing in android. I'm using the SAX parser. Now, I am stuck with the content handler.with so many tutorials I got the idea for parsing the data but all of those examples were based on the XML file that does contain the attributes in the tags. for my XML file from where I am retrieving data there no attributes in he tags but the child nodes. now im stuck here I don't have any idea how can I get the values of the child node.

   <data>
   <request>
   <type>City</type>
   <query>Peshawar, Pakistan</query>
   </request>
   <current_condition>
   <observation_time>01:04 PM</observation_time>
   <temp_C>20</temp_C>
   <temp_F>68</temp_F>
   <weatherCode>113</weatherCode>
   <weatherIconUrl>
   </weatherIconUrl>

now i want to get the data from the "" and the "" and i am really unable to find it please help me. here is my code for the content handler class.

public class HandlingXmlStuff extends DefaultHandler {

    XmlDataCollected info=new XmlDataCollected();

    public String getInformation() {        
        return info.dataToString();
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub


        if(localName.equals("query")) {
            String city=....???;
            info.setCity(city);
        } else if(localName.equals("temp_f")) {
            String t=...???;
            int temp=Integer.parseInt(t);
            info.settemp(temp);
        }
    }
}

Here is the complete parsing solution to extract the values from the xml data from the url .

A sample xml data from the provided link :

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <request>
        <type>City</type>
        <query>Peshawar, Pakistan</query>
    </request>
    <current_condition>
        <observation_time>04:31 AM</observation_time>
        <temp_C>7</temp_C>
        <temp_F>45</temp_F>
        <weatherCode>113</weatherCode>
        <weatherIconUrl><![CDATA[http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png]]>
        </weatherIconUrl>
        <weatherDesc><![CDATA[Sunny]]>
        </weatherDesc>
        <windspeedMiles>0</windspeedMiles>
        <windspeedKmph>0</windspeedKmph>
        <winddirDegree>0</winddirDegree>
        <winddir16Point>N</winddir16Point>
        <precipMM>0.0</precipMM>
        <humidity>70</humidity>
        <visibility>4</visibility>
        <pressure>1021</pressure>
        <cloudcover>0</cloudcover>
    </current_condition>
    <weather>
        <date>2013-01-26</date>
        <tempMaxC>22</tempMaxC>
        <tempMaxF>71</tempMaxF>
        <tempMinC>7</tempMinC>
        <tempMinF>45</tempMinF>
        <windspeedMiles>8</windspeedMiles>
        <windspeedKmph>13</windspeedKmph>
        <winddirection>NW</winddirection>
        <winddir16Point>NW</winddir16Point>
        <winddirDegree>315</winddirDegree>
        <weatherCode>113</weatherCode>
        <weatherIconUrl><![CDATA[http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png]]>
        </weatherIconUrl>
        <weatherDesc><![CDATA[Sunny]]>
        </weatherDesc>
        <precipMM>0.0</precipMM>
    </weather>
    <weather>
        <date>2013-01-27</date>
        <tempMaxC>20</tempMaxC>
        <tempMaxF>68</tempMaxF>
        <tempMinC>8</tempMinC>
        <tempMinF>46</tempMinF>
        <windspeedMiles>7</windspeedMiles>
        <windspeedKmph>12</windspeedKmph>
        <winddirection>N</winddirection>
        <winddir16Point>N</winddir16Point>
        <winddirDegree>352</winddirDegree>
        <weatherCode>113</weatherCode>
        <weatherIconUrl><![CDATA[http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png]]>
        </weatherIconUrl>
        <weatherDesc><![CDATA[Sunny]]>
        </weatherDesc>
        <precipMM>0.0</precipMM>
    </weather>
    <weather>
        <date>2013-01-28</date>
        <tempMaxC>20</tempMaxC>
        <tempMaxF>68</tempMaxF>
        <tempMinC>7</tempMinC>
        <tempMinF>45</tempMinF>
        <windspeedMiles>9</windspeedMiles>
        <windspeedKmph>14</windspeedKmph>
        <winddirection>NW</winddirection>
        <winddir16Point>NW</winddir16Point>
        <winddirDegree>316</winddirDegree>
        <weatherCode>113</weatherCode>
        <weatherIconUrl><![CDATA[http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png]]>
        </weatherIconUrl>
        <weatherDesc><![CDATA[Sunny]]>
        </weatherDesc>
        <precipMM>0.0</precipMM>
    </weather>
    <weather>
        <date>2013-01-29</date>
        <tempMaxC>21</tempMaxC>
        <tempMaxF>70</tempMaxF>
        <tempMinC>8</tempMinC>
        <tempMinF>46</tempMinF>
        <windspeedMiles>6</windspeedMiles>
        <windspeedKmph>9</windspeedKmph>
        <winddirection>NW</winddirection>
        <winddir16Point>NW</winddir16Point>
        <winddirDegree>306</winddirDegree>
        <weatherCode>113</weatherCode>
        <weatherIconUrl><![CDATA[http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png]]>
        </weatherIconUrl>
        <weatherDesc><![CDATA[Sunny]]>
        </weatherDesc>
        <precipMM>0.0</precipMM>
    </weather>
    <weather>
        <date>2013-01-30</date>
        <tempMaxC>19</tempMaxC>
        <tempMaxF>66</tempMaxF>
        <tempMinC>8</tempMinC>
        <tempMinF>47</tempMinF>
        <windspeedMiles>8</windspeedMiles>
        <windspeedKmph>13</windspeedKmph>
        <winddirection>WNW</winddirection>
        <winddir16Point>WNW</winddir16Point>
        <winddirDegree>289</winddirDegree>
        <weatherCode>116</weatherCode>
        <weatherIconUrl><![CDATA[http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png]]>
        </weatherIconUrl>
        <weatherDesc><![CDATA[Partly Cloudy ]]>
        </weatherDesc>
        <precipMM>0.0</precipMM>
    </weather>
</data>

HandlingXmlStuff.java :

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author visruth
 */
public class HandlingXmlStuff extends DefaultHandler {

    private String key;
    private Map<String, String> request = new HashMap<String, String>();
    private Map<String, String> current_condition = new HashMap<String, String>();
    private List<Map<String, String>> weather = new ArrayList<Map<String, String>>();
    private Map<String, String> weatherMap;
    private boolean requestStatus;
    private boolean current_conditionStatus;
    private boolean weatherStatus;

    public Map<String, String> getCurrent_condition() {
        return this.current_condition;
    }

    public Map<String, String> getRequest() {        
        return this.request;
    }

    public List<Map<String, String>> getWeather() {        
        return this.weather;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        key = qName;
        if (qName.equals("request")) {

            requestStatus = true;
        } else if (qName.equals("current_condition")) {

            current_conditionStatus = true;
        } else if (qName.equals("weather")) {
            weatherMap = new HashMap<String, String>();
            weatherStatus = true;
        }        

    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {

        String value = new String(ch, start, length).trim();
        if (requestStatus) {
            if (!key.trim().equals("request") && !key.trim().isEmpty() && !value.isEmpty()) {
                request.put(key, value);
            }            
        } else if (current_conditionStatus) {
            if (!key.trim().equals("current_condition") && !key.trim().isEmpty() && !value.isEmpty()) {
                current_condition.put(key, new String(ch, start, length).trim());
            }
        } else if (weatherStatus) {
            if (!key.trim().equals("weather") && !key.trim().isEmpty() && !value.isEmpty()) {
                weatherMap.put(key, new String(ch, start, length).trim());
            }
        }
    }

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

        if (qName.equals("request")) {
            requestStatus = false;
        } else if (qName.equals("current_condition")) {
            current_conditionStatus = false;
        } else if (qName.equals("weather")) {
            weather.add(weatherMap);
            weatherStatus = false;            
        }
    }

    public void parseDocument() {
        //get a factory
        SAXParserFactory spf = SAXParserFactory.newInstance();
        try {
            //get a new instance of parser
            SAXParser sp = spf.newSAXParser();            
            //parse the file and also register this class for call backs
            sp.parse("http://free.worldweatheronline.com/feed/weather.ashx?q=peshawar,pakistan&format=xml&num_of_days=5&key=eab9f57359164426132301", this);
        } catch (SAXException se) {
            se.printStackTrace();
        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}

You can retrieve the values using the following code :

HandlingXmlStuff handlingXmlStuf = new HandlingXmlStuff();
handlingXmlStuf.parseDocument();
System.out.println("----values inside request tag-----");
Map<String, String> request = handlingXmlStuf.getRequest();
for (String key : request.keySet()) {
    System.out.println(key + ":" + request.get(key) + ":" + key);
}
System.out.println("----values inside current_condition tag-----");
Map<String, String> current_condition = handlingXmlStuf.getCurrent_condition();
for (String key : current_condition.keySet()) {
    System.out.println(key + ":" + current_condition.get(key) + ":" + key);
}

List<Map<String, String>> weather = handlingXmlStuf.getWeather();
for (Map<String, String> map : weather) {
    System.out.println("\n----each set of weather-----start");
    for (String key : map.keySet()) {
        System.out.println(key + ":" + map.get(key) + ":" + key);
    }
    System.out.println("----each set of weather-----end");
}

From the above sample xml data you will get the below output :

----values inside request tag-----
query:Peshawar, Pakistan:query
type:City:type
----values inside current_condition tag-----
cloudcover:0:cloudcover
observation_time:04:31 AM:observation_time
pressure:1021:pressure
temp_C:7:temp_C
visibility:4:visibility
temp_F:45:temp_F
windspeedMiles:0:windspeedMiles
precipMM:0.0:precipMM
winddirDegree:0:winddirDegree
winddir16Point:N:winddir16Point
weatherIconUrl:http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png:weatherIconUrl
humidity:70:humidity
windspeedKmph:0:windspeedKmph
weatherCode:113:weatherCode
weatherDesc:Sunny:weatherDesc

----each set of weather-----start
windspeedMiles:8:windspeedMiles
winddirection:NW:winddirection
date:2013-01-26:date
precipMM:0.0:precipMM
winddir16Point:NW:winddir16Point
winddirDegree:315:winddirDegree
weatherIconUrl:http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png:weatherIconUrl
tempMinC:7:tempMinC
windspeedKmph:13:windspeedKmph
tempMaxC:22:tempMaxC
weatherCode:113:weatherCode
tempMaxF:71:tempMaxF
tempMinF:45:tempMinF
weatherDesc:Sunny:weatherDesc
----each set of weather-----end

----each set of weather-----start
windspeedMiles:7:windspeedMiles
winddirection:N:winddirection
date:2013-01-27:date
precipMM:0.0:precipMM
winddir16Point:N:winddir16Point
winddirDegree:352:winddirDegree
weatherIconUrl:_0001_sunny.png:weatherIconUrl
tempMinC:8:tempMinC
windspeedKmph:12:windspeedKmph
tempMaxC:20:tempMaxC
weatherCode:113:weatherCode
tempMaxF:68:tempMaxF
tempMinF:46:tempMinF
weatherDesc:Sunny:weatherDesc
----each set of weather-----end

----each set of weather-----start
windspeedMiles:9:windspeedMiles
winddirection:NW:winddirection
date:2013-01-28:date
precipMM:0.0:precipMM
winddir16Point:NW:winddir16Point
winddirDegree:316:winddirDegree
weatherIconUrl:http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png:weatherIconUrl
tempMinC:7:tempMinC
windspeedKmph:14:windspeedKmph
tempMaxC:20:tempMaxC
weatherCode:113:weatherCode
tempMaxF:68:tempMaxF
tempMinF:45:tempMinF
weatherDesc:Sunny:weatherDesc
----each set of weather-----end

----each set of weather-----start
windspeedMiles:6:windspeedMiles
winddirection:NW:winddirection
date:2013-01-29:date
precipMM:0.0:precipMM
winddir16Point:NW:winddir16Point
winddirDegree:306:winddirDegree
weatherIconUrl:http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png:weatherIconUrl
tempMinC:8:tempMinC
windspeedKmph:9:windspeedKmph
tempMaxC:21:tempMaxC
weatherCode:113:weatherCode
tempMaxF:70:tempMaxF
tempMinF:46:tempMinF
weatherDesc:Sunny:weatherDesc
----each set of weather-----end

----each set of weather-----start
windspeedMiles:8:windspeedMiles
winddirection:WNW:winddirection
date:2013-01-30:date
precipMM:0.0:precipMM
winddir16Point:WNW:winddir16Point
winddirDegree:289:winddirDegree
weatherIconUrl:unny_intervals.png:weatherIconUrl
tempMinC:8:tempMinC
windspeedKmph:13:windspeedKmph
tempMaxC:19:tempMaxC
weatherCode:116:weatherCode
tempMaxF:66:tempMaxF
tempMinF:47:tempMinF
weatherDesc:Partly Cloudy:weatherDesc
----each set of weather-----end

The startElement invokes when an opening tag is read, the endElement invokes when a closing tag is read and the characters method invokes each time after startElement and endElement method invoke.

Here is a solution to get the data from the given xml file.

A sample weather.xml file :

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <request>
        <type>City</type>
        <query>Peshawar, Pakistan</query>
    </request>
    <current_condition>
        <observation_time>01:04 PM</observation_time>
        <temp_C>20</temp_C>
        <temp_F>68</temp_F>
        <weatherCode>113</weatherCode>
        <weatherIconUrl> a url </weatherIconUrl>
    </current_condition>
</data>

HandlingXmlStuff.java :

import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author visruth
 */
public class HandlingXmlStuff extends DefaultHandler {

    private boolean typeStatus;
    private boolean queryStatus;
    private boolean observation_timeStatus;
    private boolean temp_CStatus;
    private boolean temp_FStatus;
    private boolean weatherCodeStatus;
    private boolean weatherIconUrlStatus;
    private String type;
    private String query;
    private String observation_time;
    private String temp_C;
    private String temp_F;
    private String weatherCode;
    private String weatherIconUrl;

    public String getObservation_time() {
        return observation_time;
    }

    public String getQuery() {
        return query;
    }

    public String getTemp_C() {
        return temp_C;
    }

    public String getTemp_F() {
        return temp_F;
    }

    public String getType() {
        return type;
    }

    public String getWeatherCode() {
        return weatherCode;
    }

    public String getWeatherIconUrl() {
        return weatherIconUrl;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

        if (qName.equals("type")) {
            typeStatus = true;
        } else {
            typeStatus = false;
        }

        if (qName.equals("query")) {
            queryStatus = true;
        } else {
            queryStatus = false;
        }

        if (qName.equals("observation_time")) {
            observation_timeStatus = true;
        } else {
            observation_timeStatus = false;
        }
        if (qName.equals("temp_C")) {
            temp_CStatus = true;
        } else {
            temp_CStatus = false;
        }

        if (qName.equals("temp_F")) {
            temp_FStatus = true;
        } else {
            temp_FStatus = false;
        }

        if (qName.equals("weatherCode")) {
            weatherCodeStatus = true;
        } else {
            weatherCodeStatus = false;
        }
        if (qName.equals("weatherIconUrl")) {
            weatherIconUrlStatus = true;
        } else {
            weatherIconUrlStatus = false;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (typeStatus) {
            this.type = new String(ch, start, length).trim();
            typeStatus = false;
        }

        if (queryStatus) {
            this.query = new String(ch, start, length).trim();
            queryStatus = false;
        }
        if (observation_timeStatus) {
            this.observation_time = new String(ch, start, length).trim();
            observation_timeStatus = false;
        }
        if (temp_CStatus) {
            this.temp_C = new String(ch, start, length).trim();
            temp_CStatus = false;
        }
        if (temp_FStatus) {
            this.temp_F = new String(ch, start, length).trim();
            temp_FStatus = false;
        }
        if (weatherCodeStatus) {
            this.weatherCode = new String(ch, start, length).trim();
            weatherCodeStatus = false;
        }
        if (weatherIconUrlStatus) {
            this.weatherIconUrl = new String(ch, start, length).trim();
            weatherIconUrlStatus = false;
        }

    }

    public void parseDocument() {
        //get a factory
        SAXParserFactory spf = SAXParserFactory.newInstance();
        try {
            //get a new instance of parser
            SAXParser sp = spf.newSAXParser();

            //parse the file and also register this class for call backs
            sp.parse(TestCase.class.getResource("wheather.xml").getPath(), this);
        } catch (SAXException se) {
            se.printStackTrace();
        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}

You can retrieve the data using the following code :

HandlingXmlStuff handlingXmlStuf = new HandlingXmlStuff();
handlingXmlStuf.parseDocument();
System.out.println("type:" + handlingXmlStuf.getType() + ":type");
System.out.println("observation_time:" + handlingXmlStuf.getObservation_time() + ":observation_time");
System.out.println("temp_C:" + handlingXmlStuf.getTemp_C() + ":temp_C");
System.out.println("temp_F:" + handlingXmlStuf.getTemp_F() + ":temp_F");
System.out.println("weatherCode:" + handlingXmlStuf.getWeatherCode() + ":weatherCode");
System.out.println("weatherIconUrl:" + handlingXmlStuf.getWeatherIconUrl() + ":weatherIconUrl");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM