2017-04-12 6 views
0

Ich versuche, diese Art von XML entordnen:JAXB unmarshall XML mit demselben Tag-Namen, aber unterschiedlicher Struktur

<result> 
    <avance>0.0000</avance> 
    <operation_status>0</operation_status> 
    <service>Bank Account</service> 
    <service> 
     <min_amount>1.00</min_amount> 
     <max_amount>1499.00</max_amount> 
     <currency>USD</currency> 
    </service> 
</result> 

Ich habe diese Art von Klassenstruktur erstellt:

public class Result { 

    private BigDecimal avance; 

    private Integer operationStatus; 

    private String serviceDesc; 

    private Service service; 

    @XmlElement(name = "service") 
    public String getServiceDesc() { 
     return serviceDesc; 
    } 

    public void setServiceDesc(String serviceDesc) { 
     this.serviceDesc = serviceDesc; 
    } 

    @XmlElement(name = "service") 
    public Service getService() { 
     return service; 
    } 

    public void setService(Service service) { 
     this.service = service; 
    } 

    @XmlElement(name = "avance") 
    public BigDecimal getAvance() { 
     return avance; 
    } 

    public void setAvance(BigDecimal avance) { 
     this.avance = avance; 
    } 

    @XmlElement(name = "operation_status") 
    public Integer getOperationStatus() { 
     return operationStatus; 
    } 

    public void setOperationStatus(Integer operationStatus) { 
     this.operationStatus = operationStatus; 
    } 
} 

und Service Aussehen wie folgt:

@XmlRootElement 
public class Service { 

    private BigDecimal minAmount; 

    private BigDecimal maxAmount; 

    private String currency; 

    @XmlElement(name = "min_amount") 
    public BigDecimal getMinAmount() { 
     return minAmount; 
    } 

    public void setMinAmount(BigDecimal minAmount) { 
     this.minAmount = minAmount; 
    } 

    @XmlElement(name = "max_amount") 
    public BigDecimal getMaxAmount() { 
     return maxAmount; 
    } 

    public void setMaxAmount(BigDecimal maxAmount) { 
     this.maxAmount = maxAmount; 
    } 

    @XmlElement(name = "currency") 
    public String getCurrency() { 
     return currency; 
    } 

    public void setCurrency(String currency) { 
     this.currency = currency; 
    } 
} 

Wenn ich Antwort von einem externen Dienst erhalte, kann ich unmarsh al diese Zeichenfolge und Ergebnis hat Service Klasse korrekt, aber serviceDesc ist immer null. Gibt es einen Weg, wie ich diese Struktur richtig entpacken kann?


In einer anderen Frage (für die diese Frage als Duplikat markiert ist) Fall ist, wenn Sie denselben Tag-Namen, aber unterschiedliche Anzahl von Attributen in meinem Fall Inhalt des Tags haben ist anders, auch in dieser Frage Klassen, zu denen Inhalt sollte abmarschiert werden Kind und Eltern in meinem Fall ist ein String ein anderes benutzerdefiniertes Objekt. Denke, deshalb konnte ich XmlAdapter nicht richtig implementieren.

+0

Mögliche Duplikat [JAXB @XmlElements, verschiedene Typen aber gleichen Namen?] (http://stackoverflow.com/questions/5007516/jaxb-xmlelements-different-types-but-same-name) – sunil

Antwort

0

Ihre XML-Struktur ist nicht gültig.

Sie sollten dieselbe Marke nicht zweimal für verschiedene Strukturen im selben Namespace haben.

Lösungen:

  • Benennen Sie Ihre Tags (serviceDesc zum Beispiel)
  • Verwendung 2 verschiedene Namensräume (ns1:service und ns2:service zum Beispiel)
+0

Das ist nicht meine Struktur Ich implementiere Integration mit externen Service, die diese Art von Antwort zurückgibt. Und ich verstehe nicht, warum dieses XML nicht gültig ist. Sie können die Gültigkeit in jedem XML-Validator überprüfen. – GROX13

+0

Sie sollten versuchen, die XSD zu erstellen, und Sie werden sehen, dass dies nicht gültig ist. –

Verwandte Themen