2016-04-09 14 views
1

Ich bin neu zu Jaxb brauche etwas Hilfe.XML-Parsing-Problem mit Jaxb

Ich bekomme Null-Werte als out Put beim Ausführen der unten Code.could einige bitte führen Sie mich, wie Sie die erwartete out Put erreichen.

Actual XMl ich entordnen versuche:

<?xml version="1.0" encoding="UTF-8"?> 
    <customer > 
    <cash xmlns:cash="uri:cash" > 
     <cash:no>10</cash:no> 
     <cash:name>naveen</cash:name> 
     <cash:age>27</cash:age> 
     <cash:phno>9176927613</cash:phno> 
    </cash> 
</customer> 

Mapping-Klassen Ich verwende:

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

@XmlRootElement(name="cash") 
public class Cash { 
    private int no; 
    private String name; 
    private int age; 
    private Long phno; 
    public int getNo() { 
     return no; 
    } 
    @XmlElement(name="cash:no",nillable=true) 
    public void setNo(int no) { 
     this.no = no; 
    } 
    public String getName() { 
     return name; 
    } 
    @XmlElement(name="cash:name",nillable=true) 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getAge() { 
     return age; 
    } 
    @XmlElement(name="cash:age",nillable=true) 
    public void setAge(int age) { 
     this.age = age; 
    } 
    public Long getPhno() { 
     return phno; 
    } 
    @XmlElement(name="cash:phno",nillable=true) 
    public void setPhno(Long phno) { 
     this.phno = phno; 
    } 
    @Override 
    public String toString() { 
     return "Cash [no=" + no + ", name=" + name + ", age=" + age + ", phno=" 
       + phno + "]"; 
    } 
} 

Kunden DTO:

import java.util.List; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="customer") 

public class Customer { 

    private List<Cash> cash; 

    public List<Cash> getCash() { 
     return cash; 
    } 
    @XmlElement(name="cash") 
    public void setCash(List<Cash> cash) { 
     this.cash = cash; 
    } 

    @Override 
    public String toString() { 
     return "Customer [cash=" + cash + "]"; 
    } 
} 

Rangierung Block:

File file = new File("cust.xml"); 

JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class); 

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 

Customer que= (Customer) jaxbUnmarshaller.unmarshal(file); 

System.out.println(que);  

tatsächliche Ausgang: Customer [cash=[Cash [no=0, name=null, age=0, phno=null]]]

Erwartete Ausgabe ist die tatsächlichen XML-Daten.

+0

Unten ist der Link zu einem Tutorial, das das gleiche tut. Ich bin nicht in der Nähe meines Computers, um zu sehen, was falsch ist. Bitte vergleichen Sie Ihren Code und Sie sollten das Problem eingrenzen. https://www.javacodegeeks.com/2013/02/jaxb-tutorial-getting-started.html – LearningPhase

Antwort

0

Auf der Cash-Klasse, statt cash: aus dem Namen Wert @XmlElement(name="cash:no",nillable=true)

try Entfernung: @XmlElement(name="no",nillable=true)

Dies erzeugt: Customer [cash=[Cash [no=10, name=naveen, age=27, phno=9176927613]]]

Eine weitere Alternative ist es, den Namensraum der Anmerkung hinzuzufügen:

@XmlElement (name = "no", namespace = "uri:cash" , nillable = true)

Um ein DefaultValidationEventHandler zum Unmarshaller mehr Einblick hinzufügen zu erhalten:

jaxbUnmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); 

erhalten Sie folgende Ausgabe:

javax.xml.bind.UnmarshalException: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{uri:cash}phno>,<{uri:cash}age>,<{uri:cash}name>,<{}cash:no> 
DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{uri:cash}phno>,<{uri:cash}age>,<{uri:cash}name>,<{}cash:no> 

Nach der @XMLElement Anmerkung, {}cash:no erwartet wird, aber die XML analysierte einen lokalen Namen aus von no und nicht cash:no

(tat dies in JDK 8)

====

Verwenden von JDK 1.6.0_65 Ich habe drei Varianten des @ XMLElement auf der Eigenschaft Cash.no ausgeführt. Dies führte zu zwei Misserfolgen und einem Erfolg. Verwenden eines Standard-Java-Maven-Projekts. Keine weiteren Änderungen in meiner Umgebung.

1 @ XmlElement (name = "bargeld: nein", nillable = wahr)

Der ursprüngliche Code.

DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{}cash:no>,<{}cash:phno>,<{}cash:name>,<{}cashage> 
2 @XmlElement (name = "no", nillable = true)
DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{}no>,<{}cash:phno>,<{}cash:name>,<{}cash:age> 
3 @XmlElement (name = "no", namespace = "uri: cash", nillable = true)
DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"name"). Expected elements are <{}cash:phno>,<{}cash:name>,<{uri:cash}no>,<{}cash:age> 

Run 3 erlebt das unerwartete Element als die ersten beiden Läufe, aber es ist auf Cash.name Eigentum.

+0

danke für deine Suggestion, aber deine Annäherung funktionierte nicht. Übrigens arbeiten wir an jdk 6. – naveenR

+0

Was hat der DefaultValidationEventHandler in der Konsolenausgabe erzeugt, als Sie ihn ausgeführt haben? – iojoe

+0

Hi naveenR, hast du eine Antwort gefunden? Ich frage mich nur, was die Lösung letztendlich war. Vielen Dank – iojoe