2010-07-08 25 views
5

C'è un codice XML piuttosto carino che mi piacerebbe rimuovere unmarshall da un oggetto java usando JaxB. La maggior parte di esso è sembrato abbastanza semplice finora - ma sto un pò bloccato su questo:JAXB: come smontare questo XML?

  <assets> 
       <asset type="fixed">74,414</asset> 
       <asset type="current">1,022,069</asset> 
       <asset type="other">0</asset> 
       <total type="assets">1,096,483</total> 
      </assets> 

Questa è la parte rilevante del DTD

<!ELEMENT assets (asset|total)*> <!ELEMENT asset (#PCDATA)> <!ATTLIST asset type CDATA #REQUIRED> <!ELEMENT total (#PCDATA)> <!ATTLIST total type CDATA #REQUIRED>

Tutte le idee? O dovrei rinunciare a provare a usare JAXB per questo?

Grazie

+0

Non vedo come sia rilevante la DTD qui ... a quale tipo di struttura di oggetti si desidera mappare? – skaffman

+0

Non ho ancora una classe a cui non riesco ad accedere, l'XML è stato precedentemente gestito da un gestore SAX. Immagino di voler provare a appiattire la struttura, poiché tutto ciò che devo fare è mostrarlo in una tabella html/PDF; il suo potenziale quotidiano, e c'è di peggio! Questa è solo una piccola parte del xml. Dalle risposte qui sembra che dovrei usare le Collezioni; Sono nuovo di JAXB e del mondo XML, ma spero che le risposte qui dovrebbero darmi alcune idee se continuo su questa strada. –

risposta

5

Guardando il XML e la DTD, ho creato il XSD della struttura:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"> 
    <xs:element name="assets"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="asset"/> 
     <xs:element maxOccurs="unbounded" ref="total"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="asset"> 
    <xs:complexType mixed="true"> 
     <xs:attribute name="type" use="required" type="xs:string"/> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="total"> 
    <xs:complexType mixed="true"> 
     <xs:attribute name="type" use="required" type="xs:string"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Usa xjc per generare le classi Java annotate con le annotazioni di legame JAXB dalla XSD. Quindi usa l'unmarshaller per renderlo unmarshal all'oggetto Java.

Modifica

classi Java generato:

import java.util.ArrayList; 
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; 
import javax.xml.bind.annotation.XmlType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlValue; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "asset", 
    "total" 
}) 
@XmlRootElement(name = "assets") 
public class Assets { 

    @XmlElement(required = true) 
    protected List<Asset> asset; 
    @XmlElement(required = true) 
    protected List<Total> total; 

    public List<Asset> getAsset() { 
     if (asset == null) { 
      asset = new ArrayList<Asset>(); 
     } 
     return this.asset; 
    } 

    public List<Total> getTotal() { 
     if (total == null) { 
      total = new ArrayList<Total>(); 
     } 
     return this.total; 
    } 

} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "content" 
}) 
@XmlRootElement(name = "asset") 
public class Asset { 

    @XmlValue 
    protected String content; 
    @XmlAttribute(required = true) 
    protected String type; 

    public String getContent() { 
     return content; 
    } 

    public void setContent(String value) { 
     this.content = value; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String value) { 
     this.type = value; 
    } 

} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "content" 
}) 
@XmlRootElement(name = "total") 
public class Total { 

    @XmlValue 
    protected String content; 
    @XmlAttribute(required = true) 
    protected String type; 

    public String getContent() { 
     return content; 
    } 

    public void setContent(String value) { 
     this.content = value; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String value) { 
     this.type = value; 
    } 

} 
1

Avete una classe che si sta unmarshalling a? E suona come sarebbe necessario quanto segue:

/** AssetContainer */ 
@XmlRootElement(namespace = "project/schema") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class AssetContainer implements Unmarshallable { 
    private List<Asset> assetList; 
    private int totalAssets; 
} 

/** Asset */ 
@XmlType 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Asset implements Unmarshallable { 
    private AssetTypeEnum type; 
    private int count; 
} 

/** Unmarshallable */ 
public interface Unmarshallable { 
    // Marker interface 
} 

e quindi utilizzare un XmlTypeAdapter per mappare gli elementi XML alla classe corretta.

Problemi correlati