Simple XML Framework -> Objekte ansprechen in tieferer Ebene

R

Rotesmofa

Erfahrenes Mitglied
20
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
 
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
 
@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.
 
  • Danke
Reaktionen: Rotesmofa
schonmal danke für die Arbeit die ich dir aufbrumme ;-)
 
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.
 

Ähnliche Themen

D
Antworten
23
Aufrufe
2.554
Data2006
D
F
Antworten
0
Aufrufe
837
FlorianAlfredo
F
Zurück
Oben Unten