2016-09-27 86 views
4

假設我有這些類:解析XML具體子類

public class Container { 
    private String name; 
    private int number; 
    private List<ParentClass> list; 
} 

public class ParentClass { 
    private String value; 
} 

如果我使用JAXB一個XML文件中讀取,我期望的XML是這樣的:

<container> 
    <name>Name</name> 
    <number>1</number> 
    <subclass> 
     <value>Val</value> 
    </subclass> 
    <subclass> 
     <value>Val2</value> 
    </subclass> 
    <subclass> 
     <value>Val3</value> 
    </subclass> 
</container> 

而且我裝點像這樣我的課:

@XmlRootElement(name = "container") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Container { 
    @XmlElement(name = "name") 
    private String name; 

    @XmlElement(name = "number") 
    private int number; 

    @XmlElement(name = "subclass", type = Subclass.class) 
    private List<ParentClass> list; 
} 

@XmlRootElement(name = "container") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ParentClass { 
    @XmlElement(name = "value") 
    private String value; 
} 

現在,假設ParentClass實際上是一個abstrac t類或接口,我有兩個從它派生的子類;是這樣的:

public abstract ParentClass { 
    void doSomething(); 
} 

public IntSubclass extends ParentClass { 
    private int value; 
    public void doSomething() { ... } 
} 

public StringSubclass extends ParentClass { 
    private String value; 
    public void doSomething() { ... } 
} 

如何使用JAXB和XML能夠解析list屬性是StringSubclassIntSubclass相應的清單?

也就是說,如果我要從XML中讀取StringSubclass元素或IntSubclass元素並且能夠識別它們是一種或另一種。類似這樣的:

<container> 
    <name>Name</name> 
    <number>1</number> 
    <stringSubclass> 
     <value>Val</value> 
    </stringSubclass> 
    <stringSubclass> 
     <value>Val2</value> 
    </stringSubclass> 
    <intSubclass> 
     <value>3</value> 
    </intSubclass> 
</container> 

有什麼辦法嗎?也許與另一個框架?

由於

+0

標註'Container.list'與https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/XmlElements.html –

回答

1

它使用註釋@XmlElements

能夠Container.class

package jaxb_element_test; 

import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElements; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "container") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Container { 
    @XmlElement(name = "name") 
    private String name; 

    @XmlElement(name = "number") 
    private int number; 

    @XmlElements({ 
      @XmlElement(name="stringSubclass", type=StringSubclass.class), 
      @XmlElement(name="intSubclass", type=IntSubclass.class)}) 
    private List<ParentClass> list; 

    public String getName() { 
     return name; 
    } 

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

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 

    public List<ParentClass> getList() { 
     return list; 
    } 

    public void setList(List<ParentClass> list) { 
     this.list = list; 
    } 
} 

IntSubclass.class

package jaxb_element_test; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class IntSubclass extends ParentClass { 

    @XmlElement(name = "value") 
    private int value; 

    public int getValue() { 
     return value; 
    } 

    public void setValue(int value) { 
     this.value = value; 
    } 


} 

StringSubclass.class

package jaxb_element_test; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class StringSubclass extends ParentClass{ 

    @XmlElement(name = "value") 
    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 


}