0

我有以下 xml 片段(这是我无法控制的):

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

我想<subcategory>被编组到一个看起来像这样的类:

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.

4

3 回答 3

2

JAXB 不会为您执行此操作。XmlAdapter不适合这个问题。当类结构与 XML 结构明显不同时,您将需要在 JAXB 绑定(使用 XSLT)之前或在 JAXB 绑定之后(使用 Java)执行附加级别的转换。

后一种选择要容易得多。您将需要一个表示 XML 结构的类,以及一个将绑定类的实例转换为所需结构的实例的转换路径。

于 2010-02-23T12:38:36.430 回答
2

如果你XMLAdapter适应Item而不是SubCategory.

项目适配器.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;
    }
}

项目代理.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;
    }
}
于 2010-02-23T17:14:59.340 回答
0

我能想到的一种方法是编写一些 XSLT,将 XML 转换为更容易在 JAXB 中映射的东西。虽然这可能会起作用,但这是我宁愿避免的额外步骤。

于 2010-02-23T12:35:27.793 回答