2010-12-30 4 views
2

Ich kann 1 Objekt ohne Probleme marshalieren und entpacken (in Netbeans); Ich muss wissen, wie man das mit mehreren Objekten macht? Ich kann nur Null-Zeiger-Ausnahmen erzeugen, wenn ich versuche, 3 Objekte aus XML in ein Array zu entpacken; also weiß ich nicht einmal, ob ich die 3 richtig geordnet habe. Ich kenne die Grundidee, das Objekt zu deklarieren und dann den Befehl jaxbu oder jaxbm zu verwenden, aber ich würde gerne sehen, dass dies für mehr als ein Objekt funktioniert.JAXB Web Services: Multiple Object Marshalling

** TLDR: Wie kann ich mehrere Objekte einer einzelnen Klasse in/aus XML marshalieren/unmarshalen? DANK

-Code Ich habe die Marschälle ein Objekt aus XML:

try { 
JAXBContext jc = JAXBContext.newInstance ("myOffers"); 
Unmarshaller u = jc.createUnmarshaller(); 
myOffers.Offer flight = (myOffers.Offer) u.unmarshal(new FileInputStream("offers.xml")); 

System.out.println ("Airline is : " + flight.getAirline()); 
System.out.println ("Origin is : " + flight.getOrigin()); 
System.out.println ("Destination is : " + flight.getDestination()); 
System.out.println ("Seats available : " + flight.getSeats()); 
System.out.println("Proximity to City Centre is : " + flight.getProximity()); 
System.out.println("Currency : " + flight.fare.getCurrency()); 
System.out.println("Value : " + flight.fare.getValue()); 

} catch (JAXBException e) {System.out.println ("Error" + e);}

ok so die xML ist:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:offer xmlns:ns2="http://simple.example.com/CInfoXmlDoc"> 
    <Origin>Nottingham</Origin> 
    <Destination>Istanbul</Destination> 
    <Airline>Lufthansa</Airline> 
    <Proximity>10</Proximity> 
    <Seats>260</Seats> 
    <Fare> 
     <Currency>GBP</Currency> 
     <Value>300</Value> 
    </Fare> 
</ns2:offer> 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:offer xmlns:ns2="http://simple.example.com/CInfoXmlDoc"> 
    <Origin>Birmingham</Origin> 
    <Destination>Cairo</Destination> 
    <Airline>Monarch</Airline> 
    <Proximity>15</Proximity> 
    <Seats>350</Seats> 
    <Fare> 
     <Currency>GBP</Currency> 
     <Value>300</Value> 
    </Fare> 
</ns2:offer> 

die von meinem Marschall-Code generiert wurde hier gefunden:

public static void main(String[] args) throws FileNotFoundException { 
int i = 0; 
int arraySize = 2; 

myOffers.Offer offer[] = new myOffers.Offer[arraySize]; 
offer[i] = new myOffers.Offer(); 
offer[i].fare = new myOffers.Offer.Fare(); 

offer[i].setAirline("Lufthansa"); 
offer[i].setOrigin("Nottingham"); 
offer[i].setDestination("Istanbul"); 
offer[i].setSeats(260); 
offer[i].setProximity(10); 
offer[i].fare.currency = "GBP"; 
offer[i].fare.value = 300; 

i++; 
offer[i] = new myOffers.Offer(); 
offer[i].fare = new myOffers.Offer.Fare(); 
offer[i].setAirline("Monarch"); 
offer[i].setOrigin("Birmingham"); 
offer[i].setDestination("Cairo"); 
offer[i].setSeats(350); 
offer[i].setProximity(15); 
offer[i].fare.currency = "GBP"; 
offer[i].fare.value = 300; 


try { 
int n = 0; 
FileOutputStream f = new FileOutputStream("offers.xml"); 
javax.xml.bind.JAXBContext jaxbCtx = javax.xml.bind.JAXBContext.newInstance(offer[n].getClass().getPackage().getName()); 
javax.xml.bind.Marshaller marshaller = jaxbCtx.createMarshaller(); 
marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "UTF-8"); //NOI18N 
marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 


while (n < arraySize) 
{ 
marshaller.marshal(offer[n], f); 
n++; 
} 
} catch (javax.xml.bind.JAXBException ex) { 
// XXXTODO Handle exception 
java.util.logging.Logger.getLogger("global").log(java.util.logging.Level.SEVERE, null, ex); //NOI18N 
} 
} 

XSD-Datei:

<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://simple.example.com/CInfoXmlDoc" 
     xmlns="http://simple.example.com/CInfoXmlDoc">     
<xsd:element name="offer"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="Origin" type="xsd:string"/> 
      <xsd:element name="Destination" type="xsd:string"/> 
      <xsd:element name="Airline" type="xsd:string"/> 
      <xsd:element name="Proximity" type="xsd:int"/> 
      <xsd:element name="Seats" type="xsd:int"/> 
      <xsd:element name="Date" type="xsd:date"/> 
      <xsd:element name="Fare"> 
       <xsd:complexType> 
        <xsd:sequence> 
         <xsd:element name="Currency" type="xsd:string"/> 
         <xsd:element name="Value" type="xsd:int"/> 
        </xsd:sequence> 
       </xsd:complexType> 
      </xsd:element> 
      <xsd:attribute></xsd:attribute> 
     </xsd:sequence>    
    </xsd:complexType> 
</xsd:element> 

+0

Irgendwelche Ideen ?? Ich arbeite immer noch an diesem .... –

+0

Jeder Code, den Sie zeigen können? –

+0

@Dave Jarvis: Ich kann Ihnen meinen Code zeigen, der ein Objekt in XML marshallt, wenn Sie möchten? –

Antwort

1

Ich schlage vor, Sie ein Root-Element namens Angebote erstellen, die alle Angebotselemente enthalten. Auf diese Weise würden Sie das Offers-Element entpacken und darin eine Methode zum Abrufen der Liste der Angebotselemente finden.

--added example--

<xsd:complexType name="offers"> 
    <xsd:sequence> 
     <xsd:element name="offersList" type="Offers" minOccurs="0" maxOccurs="unbounded"/> 
    </xsd:sequence> 
</xsd:complexType> 
+0

Danke. Es basiert auf einem XSD-Schema: –

+0

Wo wäre das Root-Element im XSD-Schema? Ich kann das Schema in meinem Beitrag nicht passen .. –

+0

endlich bekam meine XSD in der Post. Lol. ahh. Möchten Sie angeben, wo/wie das Wurzelelement aussehen soll? Ich bin so verwirrt, ich brauche jetzt nur eine Richtung. –