2010-11-11 15 views
14

Kullanım durumu:ArrayList'im neden JAXB ile uyumlu değil?

JAXBContext ctx = JAXBContext.newInstance(Books.class); 
Marshaller msh = ctx.createMarshaller(); 
msh.marshal(new Books(), System.out); 

Gördüğüm şey:

<?xml version="1.0"?> 
<books/> 

Kitaplarım nerede? :)

+0

"ArrayList" (diğer diller ArrayList'i bilmediği gibi) dizgesini oluşturamazsınız, ancak listeyi listeleyebilirsiniz. –

+0

Elite Beyefendi - Ne demek istediğinden emin değilim. Diğer XML bağlama ve serileştirme kitaplıklarından farklı olarak, JAXB çıktıda belirli bir XML içermez. –

+0

Vincenzo - Kitapların ArrayList'i uzatması mı gerekiyor? Ortak yaklaşım, Kitap sınıfının bir ArrayList özelliğine sahip olması içindir. –

cevap

12

unsurları sıralıyor edilecek

@XmlType 
class Book { 
    public String title; 

    public Book() { 
    } 

    public Book(String t) { 
     this.title = t; 
    } 
} 

@XmlType 
class Books extends ArrayList<Book> { 
    public Books() { 
     this.add(new Book("The Sign of the Four")); 
    } 
} 

@XmlRootElement(name = "books") 
class Wrapper { 
    public Books book = new Books(); 
} 

aşağıdaki gibi kullanılır kamuya açık olmalı ya da XMLElement açıklamasını almalı. ArrayList sınıfı ve sınıf Kitaplarınız bu kuralların hiçbiriyle eşleşmiyor. Kitap değerlerini sunmak için bir yöntem tanımlamanız ve bunu belirtmeniz gerekir. Bir "kendini alıcı" yöntemi ekleme yalnızca Kitaplar sınıfını değiştirmenin Kodu

,: Eğer manevra kodu çalıştırdığınızda

@XmlRootElement 
@XmlSeeAlso({Book.class}) 
public class Books extends ArrayList<Book> { 
    public Books() { 
    this.add(new Book("The Sign of the Four")); 
    } 

    @XmlElement(name = "book") 
    public List<Book> getBooks() { 
    return this; 
    } 
} 

alacağınız:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<books><book><title>The Sign of the Four</title></book></books> 

(ekledim bir netliğin sallamak için satır sonu)

+0

'Kitaplar 'sınıfım' @ XmlRootElement''na sahiptir, yani "kurallara uyuyor" ... – yegor256

+0

Evet, ancak değerleri almak için genel bir özellik veya açıklamalı bir yöntem göstermiyor.Bu yüzden yeni bir metodu tele takmanız veya bir sarıcı sınıf yazmanız gerekecek. Seni önerdiğim kodu dene. Beklenen XML’inizi oluşturacaktır. Gördüğünüz gibi, sınıf seviyesindeki notlarınızı (doğru olan) tuttum ve @XMLElement açıklamasıyla bir getBooks (aynı liste örneğini döndüren) yöntemini ekledim. –

2

Kolaylıkla bir List ürününü marshall edebilirsiniz. Listeyi kaydırmak için başka bir sınıf kullanmayı düşünün aşağıdaki çalışır:.

JAXBContext ctx = JAXBContext.newInstance(Wrapper.class); 
Marshaller msh = ctx.createMarshaller(); 
msh.marshal(new Wrapper(), System.out); 

bu sonucu üretir:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<books><book><title>The Sign of the Four</title></book></books> 
+0

Eh, bu tam olarak ne elde etmeyi beklediğim değil. Örneğini ... 'olarak değiştirebilir misiniz? – yegor256

+0

@Vincenzo: Buna göre değiştirdim. Görüyorum ki diğer cevabı zaten kabul ettin. Biraz daha kısa ama bence biraz garip. Bir XML belgesinin her zaman tek bir kök öğesi vardır. Bir 'List' doğrudan Marshalling, beklediğim şeyin biraz aksine. – musiKk

0

@Blaise ve @musiKk'ın işaret ettiği gibi, Kitaplarda Kitap Listesi'ne sahip olmak ve Kitapların gerçek kök öğesi olmasına izin vermek daha iyi olurdu. ArrayList'in kendi kodumda kabul edilebilir bir prosedürü genişletmeyi düşünmem.