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

ではなくXMLAdapter適応する場合は、これを行うことができます。ItemSubCategory

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;
    }
}
于 2010-02-23T17:14:59.340 に答える
2

JAXB はこれを行いません。XmlAdapterは、この問題には適していません。クラス構造が XML 構造と大きく異なる場合は、JAXB バインドの前 (XSLT を使用) または JAXB バインドの後に (Java を使用) 追加レベルの変換を実行する必要があります。

後者のオプションははるかに簡単です。XML の構造を表すクラスと、クラスをバインドしたインスタンスを目的の構造のインスタンスに変換する変換ルートが必要です。

于 2010-02-23T12:38:36.430 に答える
0

私が考える方法の 1 つは、XML を JAXB でマップしやすい形式に変換する XSLT を作成することです。これはおそらくうまくいくでしょうが、私はむしろ避けたい余分なステップです。

于 2010-02-23T12:35:27.793 に答える