xml 使用 sax 解析器从子标签解析数据

Posted

技术标签:

【中文标题】xml 使用 sax 解析器从子标签解析数据【英文标题】:xml parsing data from child tags using sax parser 【发布时间】:2013-01-08 06:13:17 【问题描述】:

我是 android 新手,所以如果我问一些愚蠢的问题,我很抱歉。我正在使用 android 中的天气解析。我正在使用 SAX 解析器。现在,我被内容处理程序困住了。有这么多教程,我得到了解析数据的想法,但所有这些示例都是基于包含标签中属性的 XML 文件。对于我从中检索数据的 XML 文件,标签中没有属性,只有子节点。现在我被困在这里我不知道如何获取子节点的值。

   <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>

现在我想从“”和“”中获取数据,但我真的找不到它,请帮帮我。这是我的内容处理程序类的代码。

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);
        
    

【问题讨论】:

发布完整的xml文件 free.worldweatheronline.com/feed/… 萨克斯是你唯一的选择吗? 【参考方案1】:

这是从给定的 xml 文件中获取数据的解决方案。

一个示例 weather.xml 文件:

<?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();
        
    

您可以使用以下代码检索数据:

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");

【讨论】:

非常感谢你,你帮了我很多。我不想问其他问题......在第二个代码中你粘贴了whats weather.xml。我为我的项目安排了代码,但它仍然不起作用..如果我粘贴我的所有代码和我从中解析数据的链接,你会帮助我吗? @saman 如果你觉得这篇文章有帮助,为什么不投票呢???。 weather.xml 是一个包含您在帖子中包含的 xml 数据的文件。我已将完整答案作为单独的答案发布。 您上面粘贴的代码适用于 java,但不适用于 android。如果你对 android 有一些了解,我已经在 Facebook 上给你发了一条消息,里面有我的项目文件,请在这方面帮助我。 @visruth @saman 我没有收到任何消息。您可以使用http://visruthcv.appspot.com/ 中的联系我们表格与我联系。正确填写表格,并在表格的消息字段中包含您的所有疑问。发布后您将收到确认回复,然后您可以将您的项目代码回复到该邮件。那么,您是否在您的 android 清单文件中提供了必要的权限(如互联网)?如果不给它。 如何从同一个链接解析图像。除了显示图像之外,它还向我显示了链接。你能打电话给我吗?【参考方案2】:

这是从xml data from the url 中提取值的完整解析解决方案。

来自provided link 的示例 xml 数据:

<?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();
        
    

您可以使用以下代码检索值:

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");

从上面的示例 xml 数据中,您将获得以下输出:

----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

startElement 在读取开始标签时调用,endElement 在读取结束标签时调用,characters 方法在每次调用 startElementendElement 方法后调用。

【讨论】:

我的上帝..谢谢你谢谢你谢谢你..首先我将运行这个程序,然后在此基础上我将在 android 中实现相同的代码。如果有任何问题,我会再次打扰你:p 这是我的安卓代码。它有三个类,我必须解析查询标签和 temp_f 标签。它需要 2 个输入,即城市和州。比我附加用户输入城市和州的 url。然后尝试解析数据..我正在尽力而为,你也帮了我很多。这是代码 我很高兴,但你必须为这两个帮助你的帖子投票!!!我现在可以看到您的投票声望最低。我建议您使用正确的英语,并且只使用英语。 我无法理解您的第二条评论。里面的jux是什么? @saman 我认为,首先您必须了解如何使用 *** 及其所说的规则。为什么您将这些代码发布为不同的答案????如果您要提出任何答案,则这些答案必须仅是已发布问题的正确答案。而且您还必须在单一答案帖子中发布一个答案。你在做的不是一件好事。如果您对相关代码有任何疑问,可以在问题帖中提出。很抱歉,请记住:如果您不遵守 *** 规则,那么您的帐户可能会被知名会员阻止/限制。

以上是关于xml 使用 sax 解析器从子标签解析数据的主要内容,如果未能解决你的问题,请参考以下文章

解析具有相同父子标签的 XML,然后最好使用 SAX 解析器将父标签的值链接到子标签

使用 SAX 解析器解析自关闭 XML 标记时遇到问题

71 SAX解析XML流程

在BlackBerry中使用SAX解析器解析XML

使用 SAX 解析器解析 Xml

解析XML文件之使用SAM解析器