JAXB - (Fehler beim parsen?) Exception bei Unmarshall

eaglestar

Mitglied
Einen schönen Freitag wünsche ich euch!

Ich habe Dr. Google und Krankenpflegerin Sufu mehrfach aufgesucht, aber mein Leider geht weiter. :rolleyes:

Worum gehts:

Im folgenden Code seht ihr mein Programm und zwei Klassen.
Ich möchte mit dem Programm (erstmal) nur eine XML Datei einlesen und ein bestimmtes Element (GoodUrls) auf der Konsole ausgeben lassen.

Diverse Tutorial haben mir den Weg geleitet doch folgende Codezeile löst eine Exception aus.

Code:
Collection eef = (Collection)unmarshaller.unmarshal(new FileInputStream("config.xml"));

Die Fehlermeldung dazu:
Code:
java.lang.ClassCastException: jaxb.Eef cannot be cast to jaxb.Collection


Die Klasse Eef die verlang wird, bietet mir aber nicht die Möglichkeit auf das XML-Element GoodUrls zu zugreifen. Deswegen möchte ich das Objekt als Collection casten um dann die Methode getGoodUrls() aufzurufen.

Hier nun der Code der beiden Klassen und des Programms:

Programm:
Code:
package jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
//import javax.xml.bind.Marshaller;

import xmlparser.Url;

import java.io.*;
import java.util.Iterator;
import java.util.List;



public class A {

	public static void main(String[] args) {
        try{
        	Collection collection = new Collection();
        	GoodUrls goodUrls = new GoodUrls();
        	
        	JAXBContext jc = JAXBContext.newInstance("jaxb");
        	Unmarshaller unmarshaller = jc.createUnmarshaller();
        	
        	//Eef laut Tutoarial falsch. Richtig ist Collection um GoodUrls zu selektieren
        	Collection eef = (Collection)unmarshaller.unmarshal(new FileInputStream("config.xml"));

        	
        	//System.err.println(unmarshaller.unmarshal(new FileInputStream("config.xml")).getClass().getName()); 
        	/*
        	goodUrls = collection.getGoodUrls();

Klasse Eef:
Code:
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.1-b02-fcs 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2009.01.20 at 02:13:39 PM CET 
//


package jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{}config"/>
 *         &lt;element ref="{}signature"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "config",
    "signature"
})
@XmlRootElement(name = "eef")
public class Eef {

    @XmlElement(required = true)
    protected Config config;
    @XmlElement(required = true)
    protected Signature signature;

    /**
     * Gets the value of the config property.
     * 
     * @return
     *     possible object is
     *     {@link Config }
     *     
     */
    public Config getConfig() {
        return config;
    }

    /**
     * Sets the value of the config property.
     * 
     * @param value
     *     allowed object is
     *     {@link Config }
     *     
     */
    public void setConfig(Config value) {
        this.config = value;
    }

    /**
     * Gets the value of the signature property.
     * 
     * @return
     *     possible object is
     *     {@link Signature }
     *     
     */
    public Signature getSignature() {
        return signature;
    }

    /**
     * Sets the value of the signature property.
     * 
     * @param value
     *     allowed object is
     *     {@link Signature }
     *     

     */
    public void setSignature(Signature value) {
        this.signature = value;
    }

}

Klasse Collection:
Code:
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.1-b02-fcs 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2009.01.20 at 02:13:39 PM CET 
//


package jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{}bad_urls"/>
 *         &lt;element ref="{}good_urls"/>
 *         &lt;element ref="{}prerequisite_results"/>
 *         &lt;element ref="{}testwords"/>
 *       &lt;/sequence>
 *       &lt;attribute name="Name" use="required" type="{http://www.w3.org/2001/XMLSchema}NMTOKEN" />
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "badUrls",
    "goodUrls",
    "prerequisiteResults",
    "testwords"
})
@XmlRootElement(name = "collection")
public class Collection {

    @XmlElement(name = "bad_urls", required = true)
    protected BadUrls badUrls;
    @XmlElement(name = "good_urls", required = true)
    protected GoodUrls goodUrls;
    @XmlElement(name = "prerequisite_results", required = true)
    protected PrerequisiteResults prerequisiteResults;
    @XmlElement(required = true)
    protected String testwords;
    @XmlAttribute(name = "Name", required = true)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlSchemaType(name = "NMTOKEN")
    protected String name;

    /**
     * Gets the value of the badUrls property.
     * 
     * @return
     *     possible object is
     *     {@link BadUrls }
     *     
     */
    public BadUrls getBadUrls() {
        return badUrls;
    }

    /**
     * Sets the value of the badUrls property.
     * 
     * @param value
     *     allowed object is
     *     {@link BadUrls }
     *     
     */
    public void setBadUrls(BadUrls value) {
        this.badUrls = value;
    }

    /**
     * Gets the value of the goodUrls property.
     * 
     * @return
     *     possible object is
     *     {@link GoodUrls }
     *     
     */
    public GoodUrls getGoodUrls() {
        return goodUrls;
    }

    /**
     * Sets the value of the goodUrls property.
     * 
     * @param value
     *     allowed object is
     *     {@link GoodUrls }
     *     
     */
    public void setGoodUrls(GoodUrls value) {
        this.goodUrls = value;
    }

    /**
     * Gets the value of the prerequisiteResults property.
     * 
     * @return
     *     possible object is
     *     {@link PrerequisiteResults }
     *     
     */
    public PrerequisiteResults getPrerequisiteResults() {
        return prerequisiteResults;
    }

    /**
     * Sets the value of the prerequisiteResults property.
     * 
     * @param value
     *     allowed object is
     *     {@link PrerequisiteResults }
     *     
     */
    public void setPrerequisiteResults(PrerequisiteResults value) {
        this.prerequisiteResults = value;
    }

    /**
     * Gets the value of the testwords property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getTestwords() {
        return testwords;
    }

    /**
     * Sets the value of the testwords property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setTestwords(String value) {
        this.testwords = value;
    }

    /**
     * Gets the value of the name property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getName() {
        return name;
    }

    /**
     * Sets the value of the name property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setName(String value) {
        this.name = value;
    }

}

Worin liegt der Fehler?


Gruß
eagle
 
Ja das stimmt. Hier mal ein kleiner Auszug aus der XML-Datei:

Code:
<?xml version="1.0" encoding="UTF-8" ?>
<eef>
  <config EnterpriseVersion="'5.0.4'" Schema="2.0">
      <collections Count="6">
          <collection Name="default_collection">
              <bad_urls><![CDATA[

              ]]></bad_urls>
              <good_urls><![CDATA[
/
              ]]></good_urls>
              <prerequisite_results><![CDATA[
20

Aber Eef gibt mir nicht die Möglichkeit auf getGoodUrls() zu zugreifen.
Oder muss ich über das RootElement starten?


Gruß
eagle
 
Zuletzt bearbeitet:
Ja sicher... du kannst doch nicht einfach das Eef auf Collection casten? Woher soll JAXB wissen, was du genau willst? Es bildet dir nur den kompletten XML Baum auf Objekte ab. Wenn du danach auf Teile des Baums zugreifen willst, musst du die Objekte traversieren:
Java:
for (Collection collection : eef.getConfig().getCollections()) {
  //...
}

Ich versteh ehrlich gesagt nicht, wie du darauf kommst, das mit einem Cast erschlagen zu können?

Gruß
Ollie
 
Was soll ich sagen...
Ich glaube selbst das Sprichwort: "Man sieht den Wald vor lauter Bäumen nicht." passt hier nicht ganz.

Habe die Ausgabe hinbekommen!
Hier der Code:
Java:
public class A {

	public static void main(String[] args) {
        try{
        	//Collection collection = new Collection();
        	GoodUrls goodUrls = new GoodUrls();
        	
        	JAXBContext jc = JAXBContext.newInstance("jaxb");
        	Unmarshaller unmarshaller = jc.createUnmarshaller();
        	
        	Eef eef = (Eef)unmarshaller.unmarshal(new FileInputStream("config.xml"));
        	
        	//System.out.println(eef.getConfig().getCollections());
        		
        	for (Collection collection : eef.getConfig().getCollections().getCollection()) {
        		System.out.println(collection.getGoodUrls().getContent());
        	}
        	
        	  
        }catch (Exception e ) {
            e.printStackTrace();
        }

	}
}

Vielen Dank an dich!
Du hast meine Schlaf und mein Wochenende gerettet!

Aber keine Angst, wenn ich wieder feststecke melde ich mich wieder :suspekt:

Gruß
eagle
 
Zurück