Разбор XML-данных на Android - PullRequest
0 голосов
/ 03 марта 2012

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

У меня есть 3 класса ...

public class XMLDataCollected {


     ArrayList<String> names = new ArrayList<String>();
     ArrayList<String> vicinities = new ArrayList<String>();
     ArrayList<String> types = new ArrayList<String>();
     ArrayList<String> lats = new ArrayList<String>();
     ArrayList<String> longs = new ArrayList<String>();


        String name = null;
        String vicinity = null;
        String type = null;
        String lat = null;
        String longi = null;


        public ArrayList<String> getName() {
            return names;
        }
        public void setName(String name) {
            this.names.add(name);
            this.name = name;
            Log.i("This is the name: ", name + "size: " + names.size());

        }
        public ArrayList<String> getVicinity() {
            return vicinities;
        }
        public void setVicinity(String vicinity) {
            this.vicinities.add(vicinity);
            this.vicinity = vicinity;           
            Log.i("This is the vicinity: ", vicinity);
        }
        public ArrayList<String> getType() {
            return types;
        }
        public void setType(String type) {
            this.types.add(type);
            this.type = type;
            Log.i("This is the type: ", type);
        }
        public ArrayList<String> getLat() {
            return lats;
        }
        public void setLat(String lat) {
            this.lats.add(lat);         
            this.lat = lat;
            Log.i("This is the latitude: ", lat);
        }
        public ArrayList<String> getLongi() {
            return longs;
        }
        public void setLongi(String longi) {
            this.longs.add(longi);          
            this.longi = longi;
            Log.i("This is the longitude: ", longi);
        }




        public String populate(){
            StringBuilder sb = new StringBuilder();
            sb.append(getName());
            sb.append(getVicinity());
            sb.append(getType());
            sb.append(getLat());
            sb.append(getLongi());      

            return sb.toString();
        }



2.

public class HandlingXMLStuff extends DefaultHandler {

    String elementValue = null;
    Boolean elementOn = false;
    XMLDataCollected data;


    public ArrayList<String> getData() {
        return data.getName();
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub

          elementOn = true;

            if (localName.equals("result"))         {
                data = new XMLDataCollected();
            } else if (localName.equals("CD")) {

            }
    }

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

            elementOn = false;

            /**
             * Sets the values after retrieving the values from the XML tags
             * */
            if (localName.equalsIgnoreCase("name"))
                data.setName(elementValue);
            else if (localName.equalsIgnoreCase("vicinity"))
                data.setVicinity(elementValue);
            else if (localName.equalsIgnoreCase("type"))
                data.setType(elementValue);
            else if (localName.equalsIgnoreCase("lat"))
                data.setLat(elementValue);
            else if (localName.equalsIgnoreCase("lng"))
                data.setLongi(elementValue);

        }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        if (elementOn) {
            elementValue = new String(ch, start, length);
            elementOn = false;
        }
    }

}



3.



public class XMLParsingActivity extends Activity implements OnClickListener {

    static final String baseURL = "http://www.google.com/ig/api?weather=";
    static final String test = "";

     TextView tv;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button bone = (Button) findViewById(R.id.btnone);

         tv = (TextView) findViewById(R.id.tvWeather);
        bone.setOnClickListener(this);


    }


    public String buildURL(int lat, int longi){
        String url = "";
        return url;
    }


    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        try{
            URL website = new URL(test);


            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();          
            XMLReader xr = sp.getXMLReader();

            HandlingXMLStuff doingWork = new HandlingXMLStuff();
            XMLDataCollected xdc = new XMLDataCollected();
            xr.setContentHandler(doingWork);

            xr.parse(new InputSource(website.openStream()));


            StringBuilder sb = new StringBuilder();
            String name = null;




            for(int index = 0; index < doingWork.getData().size(); index++){
                sb.append(doingWork.getData().get(index));
                Log.i("test","" + index);
            }   


//          tv.setText("Name: " + name + "\n" + "Vicinity: " + vicinity + "\n" + "Type: " + type + "\n " 
//                  + "Latitude: " + lat + "\n " + "Longitude: " + longi
//                  );
            tv.setText("The size:  "  + sb);



        }catch(Exception ex){
            tv.setText("Error" + ex.toString());
        }

    }
}

Это образец XML-файла ...

 <result>
  <name>Zaaffran Restaurant - BBQ and GRILL, Darling Harbour</name>
  <vicinity>Harbourside Centre 10 Darling Drive, Darling Harbour, Sydney</vicinity>
  <type>restaurant</type>
  <type>food</type>
  <type>establishment</type>
  <geometry>
   <location>
    <lat>-33.8719830</lat>
    <lng>151.1990860</lng>
   </location>
  </geometry>
  <rating>3.9</rating>  
   </result>

Здесь я хочу добиться итерации в результате, но в массиве результатовимеет только один элемент ... пожалуйста, помогите мне ...

1 Ответ

1 голос
/ 03 марта 2012

Это должно помочь вам http://p -xr.com / андроид-учебник-как-к-parseread-XML-данные в-андроид-ListView /

РЕДАКТИРОВАТЬ Также я рекомендую использовать общий LIST <T> вместо ArrayList<T> следующим образом

      List<String> names = new ArrayList<String>();
      ....
      ....

для оптимизации кода, так как последний ArrayList<String> занимает память. Это не большая проблема, но оптимизация является фундаментальным шагом для проверки эффективности программы (с точки зрения продолжительности и объема памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...