Android 使用SAX解析器选择特定的xml标记

Android 使用SAX解析器选择特定的xml标记,android,xml,parsing,sax,saxparser,Android,Xml,Parsing,Sax,Saxparser,我正在为android设计一个应用程序,我需要解析一个XML文件,有人告诉我SAX解析器更适合移动设备,我一直在尝试使用它,但我被卡住了。以下是XML代码: <current_conditions> <condition data="Clear"/> <temp_f data="50"/> <temp_c data="10"/> <humidity data="Humidity: 76%"/>

我正在为android设计一个应用程序,我需要解析一个XML文件,有人告诉我SAX解析器更适合移动设备,我一直在尝试使用它,但我被卡住了。以下是XML代码:

  <current_conditions>
    <condition data="Clear"/>
    <temp_f data="50"/>
    <temp_c data="10"/>
    <humidity data="Humidity: 76%"/>
    <icon data="/ig/images/weather/sunny.gif"/>
    <wind_condition data="Wind: NE at 14 mph"/>
  </current_conditions>

  <forecast_conditions>
    <day_of_week data="Tue"/> ****
    <low data="43"/>
    <high data="64"/> ****
    <icon data="/ig/images/weather/mostly_sunny.gif"/>
    <condition data="Mostly Sunny"/>
  </forecast_conditions>

  <forecast_conditions>
    <day_of_week data="Wed"/>
    <low data="43"/>
    <high data="64"/>
    <icon data="/ig/images/weather/sunny.gif"/>
    <condition data="Clear"/>
  </forecast_conditions>

要获得这两个值,您可以执行以下操作:

public class ExampleHandler extends DefaultHandler {

private static final String FORECAST_CONDITION = "forecast_condition";

private boolean day_of_week_dataWanted = false;
private boolean high_dataWanted = false;

private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();

public ParsedExampleDataSet getParsedData() {
    return this.myParsedExampleDataSet;
}

public ExampleHandler() {
    this.myParsedExampleDataSet = new ParsedExampleDataSet();
}

@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    if(FORECAST_CONDITION.equals(localName)){
        if("day_of_week".equals(localName)){
            day_of_week_dataWanted = true;
        }
        if("high".equals(localName)){
            high_dataWanted = true;
        }           
    }
}

@Override
public void characters(char ch[], int start, int length) {
    if(day_of_week_dataWanted){
        myParsedExampleDataSet.setLowValue(new String(ch, start, length));
        day_of_week_dataWanted = false;
    }
    if(high_dataWanted){
        myParsedExampleDataSet.setCurrtempValue(new String(ch, start, length));
        high_dataWanted = false;
    }
}

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

 }
}

但是,您可以看到更多优雅的解决方案,希望这能给您一个提示。

如果我是您,那么我将使用XML框架为您完成XML解析工作。那么,创建几个对象将这些数据从XML中提取出来就不会太困难了


另外,我对我所有的XML都使用简单项目,所以我甚至写了一篇博客文章解释如何在Android项目中使用它:。

我通过在数组中填充值对其进行排序,当我想显示它们时,我只需使用它们在数组中的位置来调用它们。

你想知道你的XML元素何时出现并将它们全部保存到你的“ParsedExampleDataSet”这样,如果以后需要,您可以使用它们。也许把它们保存在地图上。上面给出了您所需要的,对吗?不,它没有返回任何值。我需要得到今天的4个值,第二天的2个值。我已经能够获得当天的值。我想立即显示它们。它们已读取。您不应该立即显示它们。XML解析器填充myParsedExampleDataSet对象,然后调用getParsedData(),您可以访问变量。是的,我就是这样做的,但我仍然无法在第二天获取值,因为有一系列同名的标记
public class ExampleHandler extends DefaultHandler {

private static final String FORECAST_CONDITION = "forecast_condition";

private boolean day_of_week_dataWanted = false;
private boolean high_dataWanted = false;

private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();

public ParsedExampleDataSet getParsedData() {
    return this.myParsedExampleDataSet;
}

public ExampleHandler() {
    this.myParsedExampleDataSet = new ParsedExampleDataSet();
}

@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    if(FORECAST_CONDITION.equals(localName)){
        if("day_of_week".equals(localName)){
            day_of_week_dataWanted = true;
        }
        if("high".equals(localName)){
            high_dataWanted = true;
        }           
    }
}

@Override
public void characters(char ch[], int start, int length) {
    if(day_of_week_dataWanted){
        myParsedExampleDataSet.setLowValue(new String(ch, start, length));
        day_of_week_dataWanted = false;
    }
    if(high_dataWanted){
        myParsedExampleDataSet.setCurrtempValue(new String(ch, start, length));
        high_dataWanted = false;
    }
}

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

 }
}