Как разобрать локальный XML-файл, чтобы получить информацию о стране Android? - PullRequest
0 голосов
/ 03 января 2012

Мне нужно проанализировать XML-файл, чтобы получить информацию о стране, такую ​​как название страны и почтовый индекс страны.как я могу разобрать названия стран для адаптера счетчика, и когда я выбираю перикулярную страну с помощью счетчика, мне нужно отобразить код конкретной страны в текстовом виде.

, пожалуйста, помогите мне.

Заранее спасибо.

1 Ответ

1 голос
/ 03 января 2012

Вот код для анализа XML-файла, в котором вам нужно будет передать входной поток вашего локального XML-файла.

public static ArrayList<Country> parseCountry(Context context, InputStream inputStream) {
    String KEY = "";
    String VALUE = null;
    ArrayList<Country> arrCountires = new ArrayList<Country>();
    Country country = null;
    ArrayList<State> arrStates = null;
    State state= null;
    ArrayList<City> arrCities = null;
    City city = null;

    try {
        InputStreamReader inputreader = null;
        if(inputStream != null) {
            inputreader = new InputStreamReader(inputStream);
        }

        if(inputreader != null) {
            XmlPullParserFactory factory = null;
            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = null;
            xpp = factory.newPullParser();
            xpp.setInput(inputreader);
            int eventType = 0;
            eventType = xpp.getEventType();
            eventType = xpp.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if(eventType == XmlPullParser.START_TAG) {
                    KEY = xpp.getName();
                    if(KEY.equalsIgnoreCase(TAGS.COUNTRIES)) {
                        arrCountires = new ArrayList<Country>();

                    }else if(KEY.equalsIgnoreCase(TAGS.COUNTRY)) {
                        country = new Country();
                        arrStates = new ArrayList<State>();
                        country.setCountryId(xpp.getAttributeValue(null, TAGS.ID));

                    }else if(KEY.equalsIgnoreCase(TAGS.STATE)) {
                        state = new State();
                        arrCities = new ArrayList<City>();
                        state.setStateId(xpp.getAttributeValue(null, TAGS.ID));

                    }else if(KEY.equalsIgnoreCase(TAGS.CITY)) {
                        city = new City();
                        city.setCityId(xpp.getAttributeValue(null, TAGS.ID));
                    }
                }else if(eventType == XmlPullParser.END_TAG) {
                    KEY = xpp.getName();
                    if(KEY.equalsIgnoreCase(TAGS.COUNTRY)) {
                        country.setArrStates(arrStates);
                        arrCountires.add(country);

                    }else if(KEY.equalsIgnoreCase(TAGS.COUNTRY_NAME)) {
                        country.setCountryName(VALUE);

                    }else if(KEY.equalsIgnoreCase(TAGS.STATE_NAME)) {
                        state.setStateName(VALUE);

                    }else if(KEY.equalsIgnoreCase(TAGS.STATE)) {
                        state.setArrCities(arrCities);
                        arrStates.add(state);

                    }else if(KEY.equalsIgnoreCase(TAGS.CITY)) {
                        arrCities.add(city);
                    }else if(KEY.equalsIgnoreCase(TAGS.CITY_NAME)) {
                        city.setCityName(VALUE);
                    }
                }else if(eventType == XmlPullParser.TEXT) {
                    VALUE = xpp.getText();
                }
                eventType = xpp.next();
            }
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }finally {
        if(inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return arrCountires;
}

Вот класс Country с Getter иМетоды установки.

public class Country {

String countryId;
String countryName;
ArrayList<State> arrStates;
public ArrayList<State> getArrStates() {
    return arrStates;
}
public void setArrStates(ArrayList<State> arrStates) {
    this.arrStates = arrStates;
}
public String getCountryId() {
    return countryId;
}
public void setCountryId(String countryId) {
    this.countryId = countryId;
}
public String getCountryName() {
    return countryName;
}
public void setCountryName(String countryName) {
    this.countryName = countryName;
}

}

Вот класс адаптера для установки страны в счетчике.

private class CountryAdapter implements SpinnerAdapter{
ArrayList<Country> data;

public CountryAdapter(ArrayList<Country> data){
    this.data = data;
}

@Override
public int getCount() {
    return data.size();
}

@Override
public Object getItem(int position) {
    return data.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return android.R.layout.simple_spinner_dropdown_item;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView v = new TextView(getApplicationContext());
    v.setTextColor(Color.BLACK);
    v.setText(data.get(position).getName());
    v.setTextSize(15);
    v.setPadding(10, 10, 10, 10);
    v.setSingleLine();
    v.setEllipsize(TruncateAt.END);

    return v;
}

@Override
public int getViewTypeCount() {
    return android.R.layout.simple_spinner_item;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isEmpty() {
    return false;
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {

}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {

}

@Override
public View getDropDownView(int position, View convertView,
    ViewGroup parent) {
    return this.getView(position, convertView, parent);
}
}

Вот интерфейс черезкоторый вы можете получить выбранную страну из счетчика

OnItemSelectedListener OnCountrySelected = new OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> arg0, View v, int position,
        long id) {
    if(position != AdapterView.INVALID_POSITION) {
        System.out.println("Country name = " + arrCountries.get(position).getName());   
        //Here you can set this value to the textview
    }
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {

}
};

Вот способ, которым вы можете установить Слушатель на счетчик

spCountry.setOnItemSelectedListener(OnCountrySelected);

Вот код для открытия файла в качестве входного потока из активов

try {
    InputStream inputStream = v.getContext().getAssets().open("path of file");
    ArrayList<Country> arrCountries = parseCountry(this, inputStream);

} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Когда вы получите ответ в массиве Country, тогда установите адаптер на счетчик

CountryAdapter countryAdapter = new CountryAdapter(arrCountry);
            spCountry.setAdapter(countryAdapter);
...