выбор определенных тегов XML с помощью SAX-парсера - PullRequest
0 голосов
/ 27 апреля 2011

Я разрабатываю приложение для 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 ]

1 голос
/ 27 апреля 2011

Если бы я был вами, я бы просто использовал XML-фреймворк Simple , чтобы выполнить работу по синтаксическому анализу XML за вас. Тогда было бы не сложно создать несколько объектов, которые могли бы выделить эти данные из XML.

P.S. Я использую проект Simple для всего своего XML, поэтому я даже написал пост в блоге, объясняющий, как использовать его в проектах Android: вы можете прочитать его здесь .

0 голосов
/ 06 мая 2011

Я отсортировал это с помощью заполнения значений в массивах, и когда я хочу отобразить их, я просто использую их позицию в массиве, чтобы вызвать их

0 голосов
/ 27 апреля 2011

Чтобы получить эти два значения, вы должны сделать что-то вроде этого:

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 {

 }
}

Но есть более изящные решения, на которые вы могли бы взглянуть, надеюсь, это даст вам подсказку.

...