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

时间:2011-04-26 20:26:17

标签: 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%"/>
    <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>

我试图仅在侧面使用 * 获取两个标记的值,但它会返回文档末尾的值。我如何解决这个问题,因为我只想要XML中的某些值。这是我的代码:

 public class ExampleHandler extends DefaultHandler {

private boolean in_in_current_conditions = false;
private boolean in_in_forecast_conditions = false;

private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();
public ParsedExampleDataSet getParsedData() {
    return this.myParsedExampleDataSet;
}
@Override
public void startDocument() throws SAXException {
    this.myParsedExampleDataSet = new ParsedExampleDataSet();
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void startElement(String namespaceURI, String localName,
        String qName, Attributes atts) throws SAXException
{
    if (localName.equals("forecast_information"))
    {
        this.in_forecast_information = true;
    }
    else if (localName.equals("current_conditions"))
    {
        this.in_in_current_conditions = true;
    }
    else if (localName.equals("forecast_conditions"))
    {
        this.in_in_forecast_conditions = true;
    }
    else if (localName.equals("high")) {
        if (this.in_in_forecast_conditions)
        {
            String attrValue = atts.getValue("data");
            myParsedExampleDataSet.setCurrtempValue(attrValue);
        }
    } else if (localName.equals("day_of_week")) {
        if (this.in_in_forecast_conditions) {
            String attrValue1 = atts.getValue("data");
            myParsedExampleDataSet.setLowValue(attrValue1);
        }
    }
}

@Override
public void endElement(String namespaceURI, String localName, String qName)
        throws SAXException {
    if (localName.equals("forecast_information")) {
        this.in_forecast_information = false;
    } else if (localName.equals("current_conditions")) {
        this.in_in_current_conditions = false;
    } else if (localName.equals("forecast_conditions")) {
        this.in_in_forecast_conditions = false;
    }
}

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

3 个答案:

答案 0 :(得分:1)

如果我是你,那么我将使用Simple XML框架为您完成XML解析工作。只需创建一些可以从XML中取出这些数据的对象就不会太困难了。

P.S。我将Simple项目用于我的所有XML,所以我甚至写了一篇博客文章,解释如何在Android项目中使用它:you can read it here

答案 1 :(得分:0)

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

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 {

 }
}

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

答案 2 :(得分:0)

我已经通过使用填充数组中的值来对其进行排序,当我想显示它们时,我简单地使用它们在数组中的位置来调用它们