Mit Klasse generierte Daten aus XML auslesen

AndiE

Top Contributor
Gegeben ist eine Klasse:

Java:
@XmlRootElement
public class Todo {
	private String summary;
	private String discription;
	
	public String getSummary() {
		return summary;
	}
	public void setSummary(String summary) {
		this.summary = summary;
	}
	public String getDiscription() {
		return discription;
	}
	public void setDiscription(String discription) {
		this.discription = discription;
	}

und eine JAX-RS- Methode

Java:
    @GET
    @Produces("application/xml")
    public Todo getXML()
    {
    	Todo t= new Todo();
    	t.setDiscription("Beschreibung");
    	t.setSummary("Summe");
    	return t;
    }

Beides liefert mir
[XML]
<todo>
<discription>Beschreibung</discription>
<summary>Summe</summary>
</todo>

[/XML]

wobei ich für als Client, der ein Application-Client-Module ist, diesen Code nutze:

Java:
public class Main {
	public static void main(String[] args) {
		ClientConfig config= new DefaultClientConfig();
		Client client=Client.create(config);
		WebResource service=client.resource(UriBuilder.fromUri("http://localhost:8080/restserv/jaxrs/diener").build());
				
		String s = service.get(String.class);
		System.out.println(s);
		
	}

Die Frage ist nun, wie komme ich am besten an die Informationen. Ich nutze J6EE auf Eclipse Juno mit einem Glassfish-Server auf OpenSuSE 12.1. .

Sollte ich JAXB einbinden? Oder kann ich das mit JAXB oder Psychopath/XPath lösen. Wenn ja, wo kann ich mich diesbezüglich online belesen/ Tutorials finden. Vielleicht gibt es auch bei Oracle selbst eine Seite.
 

AndiE

Top Contributor
Hallo,

so ist das, wenn man sich mit was Neuem beschäftigt. Ich habe gestern und heute erst gelernt, das Klasse->XML als "Marshalling" und XML->Klasse als "Unmarshalling" bezeichnet wird. Die Begriffe waren mir aus dem C++, C#-Bereich gänzlich unbekannt. "Serialisierung" schon eher. Nun muss ich mich erst einmal damit beschäftigen( XSD und XML). Ich werde wohl JAXB dafür benutzen. Aber das Thema wollte ich noch hier offen lassen, weil es doch darum geht, aus einem vom JAX-RS empfangenen String zu Unmarshallen. Das könnte doch für einige weitere interessant sein. Meist wird wohl das Unmarshallen aus erstellten Dateien in Tutorials beschrieben.

Schöne Grüße

Andre'
 

AndiE

Top Contributor
Java:
	public static void main(String[] args) throws JAXBException {
		ClientConfig config= new DefaultClientConfig();
		Client client=Client.create(config);
		WebResource service=client.resource(UriBuilder.fromUri("http://localhost:8080/restserv/jaxrs/diener").build());
				
		String s = service.get(String.class);
		System.out.println(s);
		
		JAXBContext jc = JAXBContext.newInstance(Todo.class);
		Unmarshaller u=jc.createUnmarshaller();
		ByteArrayInputStream bais= new ByteArrayInputStream(s.getBytes()); 
		try {
			Todo t= (Todo)u.unmarshal(bais);
			System.out.println(t.getDiscription());
			System.out.println(t.getSummary());
		
		}
		catch(Exception e)		{
			System.out.println(e);
		}
	}

Ich habe jetzt diesen Code erstellt. Er wirft eine Exception "A Descriptor with default root element todo was not found in the project". Die XML-Datei sieht aus wie oben beschrieben. Kann das an dieser XSD-Datei liegen?

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/todo"
xmlns:tns="http://www.example.org/todo"
elementFormDefault="qualified">
<element name="todo">
<complexType>
<sequence>
<element name="discription" type="string" />
<element name="summary" type="string"/>
</sequence>
</complexType>
</element>
</schema>
[/XML]

Die mit "JAXB-Klase aus Schema"daraus abgeleitete Klasse heißt "Todo", und ich habe sie in der Methode verwendet.
Kann es sein, dass er sich am "tns"-Präfix stört?

Danke für Meldungen

Andre'
 

AndiE

Top Contributor
Ich hätte nicht gedacht, dass es so einfach ist. ich habe ein neues Application Client Projekt geöffnet. Die Klasse aus dem Serverobjekt in das Client-Objekt kopiert, und dann diesen Code eingegeben:

Java:
import java.io.ByteArrayInputStream;

import javax.ws.rs.core.UriBuilder;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import model.Todo;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;


public class Main {
	public static void main(String[] args) throws JAXBException {
		// TODO Auto-generated method stub
		
		ClientConfig config= new DefaultClientConfig();
		Client client=Client.create(config);
		WebResource service=client.resource(UriBuilder.fromUri("http://localhost:8080/restserv/jaxrs/diener").build());
		
		String s = service.get(String.class);
		System.out.println(s);
		
		JAXBContext jc = JAXBContext.newInstance(Todo.class);
		Unmarshaller u=jc.createUnmarshaller();
		ByteArrayInputStream bais= new ByteArrayInputStream(s.getBytes()); 
		Todo t=(Todo)u.unmarshal(bais);
		System.out.println(t.getDiscription());
		System.out.println(t.getSummary());
		
		
	}

	/* (non-Java-doc)
	 * @see java.lang.Object#Object()
	 */
	public Main() {
		super();
	}

}

Durch das Fehlen der JAXB-Einbindung werden die javax.xml.bind-Vorlagen importiert. So kommt es nicht zu einem Fehler. Der obige Fehler wurde durch die Einbindung von JAXB als Facet ausgelöst.
 

Ähnliche Java Themen

Neue Themen


Oben