1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Simple XML Framework -> Objekte ansprechen in tieferer Ebene

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Rotesmofa, 24.08.2011.

  1. Rotesmofa, 24.08.2011 #1
    Rotesmofa

    Rotesmofa Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    279
    Erhaltene Danke:
    20
    Registriert seit:
    08.08.2010
    Hallo Jungs,

    ich schlage mich gerade mit dem Simple XML Framework rumm.

    Meine Aufgabe ist es eine XML Datei einzulesen und von dort aus Daten für ein Gerät das mehrere Kanäle mit verschiedenen Eigenschaften hat auszulesen. Diese Eigenschaften hätte ich gerne als Objekt direkt in Java abgelegt.

    Das Simple Framework bietet hier keine Lösung oder bin ich da auf dem Holzweg?


    So wie ich das bisher überblicke muss ich das XML File einlesen und in eine Variable ablegen lassen. Um dann die einzelnen Elemente ansprechen zu können muss ich schon vorher jedes einzelne Objekt in einer Eigenen Klasse beschrieben haben.


    Hier meine Sourcen aus einem SimpleXML tutorial:

    Code:
    package com.javacodegeeks.xml.bind;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.io.StringReader;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import org.simpleframework.xml.Serializer;
    import org.simpleframework.xml.core.Persister;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast;
    
    import com.javacodegeeks.xml.bind.model.Image;
    import com.javacodegeeks.xml.bind.model.OpenSearchDescription;
    
    public class SimpleExampleActivity extends Activity {
    	
    	private static final String url = 
    		"http://dl.dropbox.com/u/7215751/JavaCodeGeeks/AndroidFullAppTutorialPart03/Transformers+2007.xml";
    	
    	private DefaultHttpClient client = new DefaultHttpClient();
    	
        @Override
        public void onCreate(Bundle savedInstanceState) {
        	
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            try {
            	
    			String xmlData = retrieve(url);
    			Serializer serializer = new Persister();        
    			
    			Reader reader = new StringReader(xmlData);
    			OpenSearchDescription osd = serializer.read(OpenSearchDescription.class, reader, false);
    						
    			Log.d(SimpleExampleActivity.class.getSimpleName(), osd.toString());
    			Toast.makeText(this, osd.toString(), Toast.LENGTH_LONG).show();
    			
    		} 
            catch (Exception e) {
            	Toast.makeText(this, "Error Occured", Toast.LENGTH_LONG).show();
    		}
            
        }
        
    	public String retrieve(String url) {
    
    		HttpGet getRequest = new HttpGet(url);
    
    		try {
    
    			HttpResponse getResponse = client.execute(getRequest);
    			final int statusCode = getResponse.getStatusLine().getStatusCode();
    
    			if (statusCode != HttpStatus.SC_OK) {
    				return null;
    			}
    
    			HttpEntity getResponseEntity = getResponse.getEntity();
    
    			if (getResponseEntity != null) {
    				return EntityUtils.toString(getResponseEntity);
    			}
    
    		} 
    		catch (IOException e) {
    			getRequest.abort();
    			Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
    		}
    
    		return null;
    
    	}
        
    }
    Code:
    package com.javacodegeeks.xml.bind.model;
    
    import org.simpleframework.xml.Attribute;
    import org.simpleframework.xml.Element;
    
    @Element
    public class Query {
    
    	@Attribute
    	public String searchTerms;
    
    	@Override
    	public String toString() {
    		StringBuilder builder = new StringBuilder();
    		builder.append("Query [searchTerms=");
    		builder.append(searchTerms);
    		builder.append("]");
    		return builder.toString();
    	}
    	
    }
    
    Code:
    package com.javacodegeeks.xml.bind.model;
    
    import java.util.List;
    
    import org.simpleframework.xml.Element;
    import org.simpleframework.xml.ElementList;
    import org.simpleframework.xml.Root;
    
    @Root
    public class OpenSearchDescription {
    	
    	@Element(name="Query")
    	public Query query;
    	
    	@Element
    	public int totalResults;
    	
    	@ElementList
    	public List<Movie> movies;
    	
    	@Override
    	public String toString() {
    		StringBuilder builder = new StringBuilder();
    		/*builder.append("OpenSearchDescription [movies=");
    		builder.append(movies);
    		builder.append(", query=");
    		builder.append(query);*/
    		
    		builder.append(totalResults);
    		
    		return builder.toString();
    	}
    
    }
    
    Code:
    package com.javacodegeeks.xml.bind.model;
    
    import java.util.List;
    
    import org.simpleframework.xml.Element;
    import org.simpleframework.xml.ElementList;
    
    @Element(name="movie")
    public class Movie {
    	
    	@Element(required=false)
    	public String score;
    	
    	@Element(required=false)
    	public String popularity;
    	
    	@Element(required=false)
    	public String name;
    	
    	@Element(required=false)
    	public String id;
    	
    	@Element(required=false)
    	public String biography;
    	
    	@Element(required=false)
    	public String url;
    	
    	@Element(required=false)
    	public String version;
    	
    	@Element(required=false)
    	public String lastModifiedAt;
    	
    	@ElementList
    	public List<Image> images;
    
    	@Override
    	public String toString() {
    		StringBuilder builder = new StringBuilder();
    		builder.append("Movie [biography=");
    		builder.append(biography);
    		builder.append(", id=");
    		builder.append(id);
    		builder.append(", images=");
    		builder.append(images);
    		builder.append(", lastModifiedAt=");
    		builder.append(lastModifiedAt);
    		builder.append(", name=");
    		builder.append(name);
    		builder.append(", popularity=");
    		builder.append(popularity);
    		builder.append(", score=");
    		builder.append(score);
    		builder.append(", url=");
    		builder.append(url);
    		builder.append(", version=");
    		builder.append(version);
    		builder.append("]");
    		return builder.toString();
    	}
    
    }
    
    Code:
    package com.javacodegeeks.xml.bind.model;
    
    import org.simpleframework.xml.Attribute;
    import org.simpleframework.xml.Element;
    
    @Element(name="image")
    public class Image {
    
    	@Attribute
    	public String type;
    	
    	@Attribute
    	public String url;
    	
    	@Attribute
    	public String size;
    	
    	@Attribute
    	public int width;
    	
    	@Attribute
    	public int height;
    	
    	@Attribute
    	public String id;
    	
    	@Override
    	public String toString() {
    		StringBuilder builder = new StringBuilder();
    		builder.append("Image [height=");
    		builder.append(height);
    		builder.append(", id=");
    		builder.append(id);
    		builder.append(", size=");
    		builder.append(size);
    		builder.append(", type=");
    		builder.append(type);
    		builder.append(", url=");
    		builder.append(url);
    		builder.append(", width=");
    		builder.append(width);
    		builder.append("]");
    		return builder.toString();
    	}
    
    }
    

    Das XML File: http://dl.dropbox.com/u/7215751/JavaCodeGeeks/AndroidFullAppTutorialPart03/Transformers+2007.xml


    Um nochmal zu konkretisieren ich möchte aus meinem Code direkt den Wert für das rating für Movie Element 1 auslesen. Wie gehe ich das am geschicktesten an?


    Gruß
    euer
    Rotesmofa
     
  2. surtic, 24.08.2011 #2
    surtic

    surtic Fortgeschrittenes Mitglied

    Beiträge:
    252
    Erhaltene Danke:
    14
    Registriert seit:
    12.04.2010
  3. Rotesmofa, 26.08.2011 #3
    Rotesmofa

    Rotesmofa Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    279
    Erhaltene Danke:
    20
    Registriert seit:
    08.08.2010
    Habe das gerade eben mal durchgespielt.

    Auch mit diesem Tutorial habe ich Probleme. Rufe ich das ganze wie dort beschrieben in meiner onCreate auf dann wirft mir: XMLReader xmlReader = XMLReaderFactory.createXMLReader(); eine SAX exception.

    Hast du vielleicht noch ein Eclipse Projekt o.ä. wo du es erfolgreich getestet hattest?

    Gruß
    Rotesmofa
     
  4. surtic, 26.08.2011 #4
    surtic

    surtic Fortgeschrittenes Mitglied

    Beiträge:
    252
    Erhaltene Danke:
    14
    Registriert seit:
    12.04.2010
    @Rotesmofa: Sorry, hab es direkt in mein Projekt integriert und die Fehler behoben :) ich schau es mir grad nochmal an und zeige dir was ich geändert habe.
     
    Rotesmofa bedankt sich.
  5. Rotesmofa, 26.08.2011 #5
    Rotesmofa

    Rotesmofa Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    279
    Erhaltene Danke:
    20
    Registriert seit:
    08.08.2010
    schonmal danke für die Arbeit die ich dir aufbrumme ;-)
     
  6. surtic, 26.08.2011 #6
    surtic

    surtic Fortgeschrittenes Mitglied

    Beiträge:
    252
    Erhaltene Danke:
    14
    Registriert seit:
    12.04.2010
    Kannst du denn noch sagen wo genau der Fehler Passiert irgend welche Debug Ausgabe oder so? Schon mal den logcat angeschaut? Eventuell kannst du auch den für den bereich zugehörigen Code zeigen.
     

Diese Seite empfehlen