Wątek przeniesiony 2017-10-08 17:12 z Java przez Koziołek.

Implementacja danych z XML

0

Tworzę swoją pierwszą "większą" aplikację i utknąłem.

Mam klasę:

 //xml
    public class BackgroundAsyncTask extends AsyncTask<String, Void, String>{
        @Override
        protected String doInBackground(String ...params) {
            URL url = null;
            String returnedResult = "";
            try {
                url = new URL(params[0]);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            HttpURLConnection conn = null;
            try {
                conn = (HttpURLConnection)url.openConnection();
                conn.setReadTimeout(10000);
                conn.setConnectTimeout(20000);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                conn.connect();
                InputStream is = conn.getInputStream();
                parser.setInput(is, null);
                returnedResult = getLoadedXmlValues(parser);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
            return returnedResult;
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            if(!s.equals("")){
              displayXmlContent.setText(s);
            }
        }
        private String getLoadedXmlValues(XmlPullParser parser) throws XmlPullParserException, IOException {
            int eventType = parser.getEventType();
            String name = null;
            pogoda.BackgroundAsyncTask.Entity mEntity = new pogoda.BackgroundAsyncTask.Entity();
            while (eventType != XmlPullParser.END_DOCUMENT){
                if(eventType == XmlPullParser.START_TAG){
                    name = parser.getName();
                    if(name.equals("act_model_date")){
                        mEntity.act_model_date = parser.nextText();
                    }
                }
                eventType = parser.next();
            }
            return mEntity.act_model_date.replace(" ","");
        }
        public class Entity{
            public String act_model_date;

        }
    }

Wszystko super

  //xml
        pogoda.BackgroundAsyncTask backgroundAsyncTask = new pogoda.BackgroundAsyncTask();
        backgroundAsyncTask.execute(xmlPath);

        try {
            xmlPullParserFactory = XmlPullParserFactory.newInstance();
            xmlPullParserFactory.setNamespaceAware(false);
            parser = xmlPullParserFactory.newPullParser();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
      displayXmlContent = (TextView)findViewById(R.id.display_xml);

Ładnie wyświetla się w text view.

Natomiast najważniejszym elementem jest wyświetlenie aktualnej pogody, a żeby całość zadziałała muszę pobrać aktualną datę z xml.

Robię to w ten sposób:

 new pogoda.DownloadImageFromInternet((ImageView) findViewById(R.id.imageView16))
                .execute("http://www.meteo.pl/um/metco/mgram_pict.php?ntype=0u&fdate="+displayXmlContent+"&row=461&col=215&lang=pl");

Natomiast +displayXmlContent+ nie działa.

Proszę Was o pomoc. Co zrobić, aby dodać do linku dane z XML? Zamienić zmienną w stinga? Jak to zrobić?

Z góry dziękuję!

Pytanie dodatkowe, także mam z tym problem. Próbowałem "wszystkie" i niestety nadal nie działa.

Otóż... co jeśli pobierany plik XML ma więcej danych? Które nazywają się tak samo, a mają inne wartości? Serdeczna prośba o podpowiedź.

0

Spróbuj displayXmlContent.getText() i ewentualnie .toString()

0
android_noob napisał(a):

Spróbuj displayXmlContent.getText() i ewentualnie .toString()

Niestety nie działa :(.

 new pogoda.DownloadImageFromInternet((ImageView) findViewById(R.id.imageView16))
                .execute("http://www.meteo.pl/um/metco/mgram_pict.php?ntype=0u&fdate="+displayXmlContent.getText()+"&row=461&col=215&lang=pl");
      

screenshot-20171004222633.png

0

Jeszcze dla pewności sprostuję :).
Oczywiście jak wpiszę http://www.meteo.pl/um/metco/mgram_pict.php?ntype=0u&fdate=2017100406&row=461&col=215&lang=pl
Grafika pojawia się poniżej "Katowice".

0

Spróbuj tak zrobić, żeby w tym TextView był tylko ten kod, bez nazwy miasta, którą mógłbyś np. wstawić do drugiego TextView poniżej

0
android_noob napisał(a):

Spróbuj tak zrobić, żeby w tym TextView był tylko ten kod, bez nazwy miasta, którą mógłbyś np. wstawić do drugiego TextView poniżej

Ale tak jest, to co widzisz na screeenie to inne textView.
Zmienna displayXmlContent zawiera tylko datę pobraną z XML.

0

Może spróbuj wypisać do loga wartość tego displayXmlContent żeby wiedzieć czy na pewno dobre dane przekazuje

0
android_noob napisał(a):

Może spróbuj wypisać do loga wartość tego displayXmlContent żeby wiedzieć czy na pewno dobre dane przekazuje

A jak to zrobić? Jak z poziomu logów wyświetlić wartość zmiennej?

0

W Twoim przypadku to by było coś w stylu Log.i("displayXmlContent value:", displayXmlContent.getText().toString());

0
sc4recrow napisał(a):

W Twoim przypadku to by było coś w stylu Log.i("displayXmlContent value:", displayXmlContent.getText().toString());

Starsznie mi wstyd, ale nie działa...

Wpisałem:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pogoda);

        //xml
        pogoda.BackgroundAsyncTask backgroundAsyncTask = new pogoda.BackgroundAsyncTask();
        backgroundAsyncTask.execute(xmlPath);

        try {
            xmlPullParserFactory = XmlPullParserFactory.newInstance();
            xmlPullParserFactory.setNamespaceAware(false);
            parser = xmlPullParserFactory.newPullParser();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
      displayXmlContent = (TextView)findViewById(R.id.display_xml);
        Log.i("displayXmlContent", displayXmlContent.getText().toString());

I niestety w logcat nie pojawia się... przeklikałem wszystkie zakładki. Oczywiście w emulatorze wchodzę w konkretną activity gdzie jest kod.

Proszę jeszcze o sugestie co robię źle.

W międzyczasie przejrzałem też parę tutoriali na youtube, ale niestety nadal nie działa.

0

Zadziałało:

Log.i("displayXmlContent", String.valueOf(displayXmlContent));

Komunikat:

10-10 1704.211 21199-21199/pl.nazwa.nazwaapki I/displayXmlContent: android.support.v7.widget.AppCompatTextView{e7c4958 V.ED..... ......ID 0,0-0,0 #7f0d007d app:id/display_xml}

0

Odświeżam wątek. Próbowałem już chyba wszystkiego.
Polecicie jakieś gotowce/projekty parsowania xml online?

1 użytkowników online, w tym zalogowanych: 0, gości: 1