1. Wir haben diesmal 2 Gewinnspiele zeitgleich für euch - Gewinne einmal ein UMI Plus E - Beim 2ten könnt ihr ein Nomu S30 gewinnen!
  1. Rotesmofa, 24.08.2011 #1
    Rotesmofa

    Rotesmofa Threadstarter Fortgeschrittenes Mitglied

    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

  3. Rotesmofa, 26.08.2011 #3
    Rotesmofa

    Rotesmofa Threadstarter Fortgeschrittenes Mitglied

    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

    @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

    schonmal danke für die Arbeit die ich dir aufbrumme ;-)
     
  6. surtic, 26.08.2011 #6
    surtic

    surtic Fortgeschrittenes Mitglied

    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

Besucher kamen mit folgenden Begriffen auf unsere Seite:

  1. xml attribut ansprechen r

    ,
  2. Simple XML-Framework