2010-02-23 74 views
0

我有以下XML片段(這是我無法控制的):我想<subcategory>JAXB解組基於同級元素

<item> 
    <name>Name</name> 
    <category>1</category> 
    <subcategory>2</subcategory> 
</item> 

進行解組的一類,看起來像這樣:

public class SubCategory { 
    private Category parent; 
    private int code; 
    private String name; 

    public SubCategory(int code, Category parent){ 
    this.code = code; 
    this.parent = parent; 
    this.name = lookupName(code); 
    } 

    // Getters, setters and lookupName(int) here 
} 

換句話說,<category>標記產生的對象應該傳遞給<subcategory>元素產生的對象。

我該怎麼做?這甚至有可能嗎?我知道XmlAdapter,但我看不出父母。

我更喜歡它,如果它可以在構造函數中完成,所以一個實例永遠不會處於無效狀態,但我會解決不同的解決方案,只要我不必手動設置每個SubCategory的父項。

回答

2

您可以用XMLAdapter如果你適應Item而非SubCategory做到這一點。

ItemAdapter.java:

public class ItemAdapter extends XmlAdapter<ItemProxy, Item> 
{ 
    @Override 
    public ItemProxy marshal(Item v) throws Exception 
    { 
     ItemProxy proxy = new ItemProxy(); 

     proxy.setCategory(v.getCategory().getCode()); 
     proxy.setSubcategory(v.getSubCategory().getCode()); 
     proxy.setName(v.getName()); 

     return proxy; 
    } 

    @Override 
    public Item unmarshal(ItemProxy v) throws Exception 
    { 
     Item item = new Item(); 

     Category category = new Category(v.getCategory()); 
     SubCategory subCategory = new SubCategory(v.getSubcategory(), category); 

     item.setName(v.getName()); 
     item.setCategory(category); 
     item.setSubCategory(subCategory); 

     return item; 
    } 
} 

ItemProxy.java:

@XmlRootElement(name = "item") 
public class ItemProxy 
{ 
    private String name; 
    private int category; 
    private int subcategory; 

    @XmlElement 
    public String getName() 
    { 
     return name; 
    } 

    @XmlElement 
    public int getCategory() 
    { 
     return category; 
    } 

    @XmlElement 
    public int getSubcategory() 
    { 
     return subcategory; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public void setCategory(int category) 
    { 
     this.category = category; 
    } 

    public void setSubcategory(int subcategory) 
    { 
     this.subcategory = subcategory; 
    } 
} 
+0

如果項目不是根節點這隻將工作 - 看https://jaxb.dev.java.net /issues/show_bug.cgi?id=117 – mtpettyp 2010-02-23 17:18:11

0

我可以考慮的一種方法是編寫一些XSLT,它將XML轉換爲更易於在JAXB中映射的東西。雖然這可能會起作用,但這是我寧願避免的額外步驟。

2

JAXB不會爲你做這件事。 XmlAdapter不適用於此問題。當類結構與XML結構顯着不同時,則需要在JAXB綁定(使用XSLT)之前或JAXB綁定(使用Java)之前執行額外的轉換級別。

後一個選項要容易得多。您將需要一個表示XML結構的類,以及一個轉換路由,該轉換路由將將類綁定到實例所需結構的實例。