2010-02-23 78 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结构的类,以及一个转换路由,该转换路由将将类绑定到实例所需结构的实例。