1

この Web サービスから日の出と日の入りの時間を解析し、それらを 2 つの別々のテキストビューに表示しようとしています。

私はこのチュートリアルに従おうとしましたが、それを適応させる方法を理解するのに苦労しています: http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/

その例では、xml ファイルには親ノードと子ノードがあり、それらをすべて収集するためのループがあります。私の例では、2 つの特定のパラメーターを取得して表示できるようにしたいだけです。

これは私が現在持っているコードです。現時点では、Web サービスを呼び出し、EditText に完全な xml ファイルを表示します。すべてではなく、個々の値をどのように解析するかを考え出す必要があります。

      package com.authorwjf.http_get;
      import java.io.IOException;
      import java.io.InputStream;
      import org.apache.http.HttpEntity;
      import org.apache.http.HttpResponse;
      import org.apache.http.client.HttpClient;
      import org.apache.http.client.methods.HttpGet;
      import org.apache.http.impl.client.DefaultHttpClient;
      import org.apache.http.protocol.BasicHttpContext;
      import org.apache.http.protocol.HttpContext;
      import android.app.Activity;
      import android.os.AsyncTask;
      import android.os.Bundle;
      import android.view.View;
      import android.view.View.OnClickListener;
      import android.widget.Button;
      import android.widget.EditText;

public class Main extends Activity implements OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    findViewById(R.id.my_button).setOnClickListener(this);
}

@Override
public void onClick(View arg0) {
    Button b = (Button)findViewById(R.id.my_button);
    b.setClickable(false);
    new LongRunningGetIO().execute();
}

private class LongRunningGetIO extends AsyncTask <Void, Void, String> {

    protected String getASCIIContentFromEntity(HttpEntity entity) throws IllegalStateException, IOException {
       InputStream in = entity.getContent();
         StringBuffer out = new StringBuffer();
         int n = 1;
         while (n>0) {
             byte[] b = new byte[4096];
             n =  in.read(b);
             if (n>0) out.append(new String(b, 0, n));
         }
         return out.toString();
    }

    @Override
    protected String doInBackground(Void... params) {
        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        String finalURL = "http://www.earthtools.org/sun/52.77431872/-1.20639/4/12/99/0";
        HttpGet httpGet = new HttpGet(finalURL);
        String text = null;
        try {
            HttpResponse response = httpClient.execute(httpGet,
                    localContext);
            HttpEntity entity = response.getEntity();
            text = getASCIIContentFromEntity(entity);
        } catch (Exception e) {
            return e.getLocalizedMessage();
        }
        return text;
    }   

    protected void onPostExecute(String results) {
        if (results!=null) {
            EditText et = (EditText)findViewById(R.id.my_edit);
            et.setText(results);
        }
        Button b = (Button)findViewById(R.id.my_button);
        b.setClickable(true);
    }
}
}

私はしばらくこれを整理しようとしてきましたが、誰かが私を助けて、素晴らしい日の出と日の入りの時間をつかむための実用的なコードを見せてくれれば、あきらめる準備ができています.

ご覧いただきありがとうございます×

4

4 に答える 4

0

最も簡単な XML DOM パーサーを使用する必要があります。

resultsを使用して XML パーサーにテキストを送信DocumentBuilderFactoryし、パーサーから日没や日の出などのさまざまな値を要求する必要があります。

このチュートリアルに従うことをお勧めします: Android XML Parsing Tutorial – Using DOMParser


日の出の例(疑似コード...非常に疑似コード):

NodeList nodeList = doc.getElementsByTagName("Morning");
Node node = nodeList.get("sunrise");
String sunrise = node.getValue();
于 2013-03-29T20:06:56.140 に答える
0

http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

http://www.mkyong.com/java/how-to-read-xml-file-in-Java-dom-parser/

Sax パーサーまたは w3c dom パーサーを選択できます。

上記には同じチュートリアルがあります。

public class MainActivity extends Activity {
String lsunrise,sunset;
String xml=    "<sun >"+
"<version>1.0</version>"+
"<location>"+
"<latitude>52.77431872</latitude>"+
"<longitude>-1.20639</longitude>"+
"</location>"+
"<date>"+
"<day>4</day>"+
"<month>12</month>"+
"<timezone>0</timezone>"+
"<dst>0</dst>"+
"</date>"+
"<morning>"+
"<sunrise>07:45:31</sunrise>"+
"<twilight>"+
"<civil>07:05:54</civil>"+
"<nautical>06:22:57</nautical>"+
"<astronomical>05:41:56</astronomical>"+
"</twilight>"+
"</morning>"+
"<evening>"+
"<sunset>16:02:28</sunset>"+
"<twilight>"+
"<civil>16:42:03</civil>"+
"<nautical>17:24:58</nautical>"+
"<astronomical>18:05:57</astronomical>"+
"</twilight>"+
"</evening>"+
"</sun>";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    parse();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
  void parse()
   { try 
        {

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(xml));
    DefaultHandler handler = new DefaultHandler() {


     boolean sr=false;
     boolean ss=false;


    public void startElement(String uri, String localName,String qName, 
                Attributes atts) throws SAXException {

        //System.out.println("Start Element :" + qName);

        if (qName.equalsIgnoreCase("sunrise")) {
            sr=true;
        }

        if (qName.equalsIgnoreCase("sunset")) {
            ss=true;
        }



    }

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

        //System.out.println("End Element :" + qName);

    }

    public void characters(char ch[], int start, int length) throws SAXException         
        {
        if (sr) {
            System.out.println("FSun rise: " + new String(ch, start, length));
            sr = false;
        }

        if (ss) {
            System.out.println("Sun set : " + new String(ch, start, length));
            ss = false;
        }


    }

     };

       saxParser.parse(is, handler);

     } catch (Exception e) {
       e.printStackTrace();
     }


    }
  }

日の出と日の入りを出力します。それに応じて上記を変更して、他のタグ値を取得します。

于 2013-03-29T20:07:24.350 に答える
0

これは XML コードを解析するための「最も簡単」または「最も速い」実装ではありませんが、私は常に Android の SAXParser ユーティリティを使用することを好みます。

すべてを段階的に分解するための優れたチュートリアルは、tutsplus.com にあります。

于 2013-03-29T20:16:50.383 に答える
0

編集: この関連する質問を参照してください。Web サービスからの日の出と日の入りの値の解析

xml を解析し、値をビューに設定できます。このチュートリアルをチェックしてください。

import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

//here's your xml string.
String test = "<sun xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://www.earthtools.org/sun.xsd\"><version>1.0</version><location><latitude>52.77431872</latitude><longitude>-1.20639</longitude></location><date><day>4</day><month>12</month><timezone>0</timezone><dst>0</dst></date><morning><sunrise>07:45:31</sunrise><twilight><civil>07:05:54</civil><nautical>06:22:57</nautical><astronomical>05:41:56</astronomical></twilight></morning><evening><sunset>16:02:28</sunset><twilight><civil>16:42:03</civil><nautical>17:24:58</nautical><astronomical>18:05:57</astronomical></twilight></evening></sun>";
try {

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        InputSource s = new InputSource(new StringReader(test)); 
        Document doc = dBuilder.parse(s);

        doc.getDocumentElement().normalize();

        Log.v("Root element :" + doc.getDocumentElement().getNodeName());

        NodeList nList = doc.getElementsByTagName("morning");

        Log.v("----------------------------");

        for (int temp = 0; temp < nList.getLength(); temp++) {

            Node nNode = nList.item(temp);

            System.out.println("\nCurrent Element :" + nNode.getNodeName());

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) nNode;

                System.out.println("sunrise : " + eElement.getElementsByTagName("sunrise").item(0).getTextContent());

            }
        }
        } catch (Exception e) {
        e.printStackTrace();
        }
于 2013-03-29T21:15:28.027 に答える