2013-03-29 43 views
0

好吧,所以看起來我卡住了,可以做一些幫助。從網絡服務解析日出和日落值

用我當前的經度和緯度成功呼叫this webservice後,我得到整個xml文件迴應。

但是,我想要的xml文件的唯一一點是日出和日落時間,我該如何解析這些文件,並將這些文件解析爲TextViews?

我已經看過並嘗試過無數關於XmlPullParser,DOMParser和SAXParser的教程,我現在正在努力。根據要求

代碼:

import java.io.IOException; 
import java.io.InputStream; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
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.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
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; 
import android.widget.TextView; 

public class SunriseSunset extends Activity implements OnClickListener { 

    public Button getLocation; 
    public TextView LongCoord; 
    public TextView LatCoord; 
    public double longitude; 
    public double latitude; 
    public LocationManager lm; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sunrisesunset); 
     findViewById(R.id.my_button).setOnClickListener(this); 
     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, 
       new MyLocationListener()); 

     getLocation = (Button) findViewById(R.id.GetLocation); 
     LongCoord = (TextView) findViewById(R.id.LongCoord); 
     LatCoord = (TextView) findViewById(R.id.LatCoord); 

     getLocation.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // When GetLocation button is clicked the showCurrentLocation 
       // function is ran 
       showCurrentLocation(); 
      } 

     }); 
    } 

    protected void showCurrentLocation() { 
     // TODO Auto-generated method stub 
     // This is called to find current location based on GPS data and sends 
     // this to LongCoord and LatCoord TextViewsw 
     Location location = lm 
       .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     latitude = location.getLatitude(); 
     longitude = location.getLongitude(); 

     LongCoord.setText(Double.toString(longitude)); 
     LatCoord.setText(Double.toString(latitude)); 
    } 

    @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(); 
      //Finds todays date and adds that into the URL 
      Calendar c = Calendar.getInstance(); 
      System.out.println("Current time => " + c.getTime()); 
      SimpleDateFormat df = new SimpleDateFormat("dd/MM"); 
      String formattedDate = df.format(c.getTime()); 

      String finalURL = "http://www.earthtools.org/sun/" 
        + LatCoord.getText().toString().trim() + "/" 
        + LongCoord.getText().toString().trim() + "/" 
        + formattedDate + "/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); 
     } 
    } 

    class MyLocationListener implements LocationListener { 
     @Override 
     public void onLocationChanged(Location location) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      // TODO Auto-generated method stub 
     } 
    } 
} 

這裏是正在使用的佈局:在您的幫助

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".SunriseSunset" > 

    <LinearLayout 
     android:id="@+id/LinearLayout02" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" > 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="Date:" 
      android:textAppearance="?android:attr/textAppearanceMedium" /> 

     <TextView 
      android:id="@+id/Date" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="Today" 
      android:textAppearance="?android:attr/textAppearanceMedium" /> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/LinearLayout02" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" > 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="Location:" 
      android:textAppearance="?android:attr/textAppearanceMedium" /> 

     <TextView 
      android:id="@+id/Date" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="Current Location" 
      android:textAppearance="?android:attr/textAppearanceMedium" /> 

    </LinearLayout> 

    <Button 
     android:id="@+id/GetLocation" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="Find Location" /> 

    <TextView 
     android:id="@+id/LatCoord" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <TextView 
     android:id="@+id/LongCoord" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="Calculate Sunrise/Sunset Time" 
     android:id="@+id/my_button"/> 
    <EditText 
     android:layout_margin="20dip" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:minLines="30" 
     android:maxLines="30" 
     android:textSize="12sp" 
     android:editable="false" 
     android:id="@+id/my_edit"/> 

</LinearLayout> 

謝謝!

回答

2

你可以試試下面的替換您的onPostExecute並添加此導入...

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; 


protected void onPostExecute(String results) { 
     if (results != null) { 
     try { 

      DocumentBuilderFactory dbFactory = DocumentBuilderFactory 
        .newInstance(); 
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
      InputSource s = new InputSource(new StringReader(result)); 
      Document doc = dBuilder.parse(s); 
      doc.getDocumentElement().normalize(); 
          //EditText et = (EditText) findViewById(R.id.my_edit); 
          TextView tv = (TextView) findViewById(R.id.Date); 
          tv.setText("sunrise at "+doc.getElementsByTagName("sunrise").item(0).getTextContent() + " sunset at "+doc.getElementsByTagName("sunset").item(0).getTextContent()); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    Button b = (Button) findViewById(R.id.my_button); 
    b.setClickable(true); 
    } 

編輯:我不知道你要設置哪些TextView的,但我想這一個(R.id 。日期)。 如果它不是正確的,你可以改變它。

//EditText et = (EditText) findViewById(R.id.my_edit); 
TextView tv = (TextView) findViewById(R.id.Date); 
tv.setText... 
+0

幹得好。快樂的編碼! – pt2121