xmlElements具有相同的名称和不同的类型

时间:2013-04-29 11:46:59

标签: xml jaxb choice

我有一个xmlelement,可以来自不同的类型。独立于类型,它具有相同的名称。它可以是一个对象,也可以只是通过URI引用现有对象。我认为xmlElements可能是解决方案。编组工作正常但通过解组它,它每次都选择最后给定的类类型。

包含元素的类花

@XmlRootElement(name = "Flower")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "id", "name", "refName", "description", "created", "updated", "color",
    "seed")
public class Flower extends CommonElements{

private string color;
@XmlElements({
    @XmlElement(name="seed", type=Seed.class),
    @XmlElement(name="seed", type=Reference.class)  
})
public Object seed;

}

类种子,它是元素可以包含的类型之一

@XmlRootElement(name = "Seed")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "id", "name", "refName", "description", "created", "updated",
    "category", "country"})
public class Seed extends CommonElements{

protected String category = "";
protected String country = "";

}

元素可以包含的另一个类

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Reference {
@XmlAttribute(name="href")
protected URI href;
}

在CommonElements中只是一些通用元素,如id,refName,description等。 XML看起来像

<Flower>
    <id>http://localhost/test/flowers/1</id>
    <refName>redRose</refName>
    <description>classical red rose </description>
    <color>red</color>
    <seed href="http://localhost/test/seeds/1" />
</Flower>

或者喜欢

<Flower>
   <id>http://localhost/test/flowers/1</id>
   <refName>redRose</refName>
   <description>classical red rose </description>
   <color>red</color>
   <seed>
      <id>http://localhost/test/seeds/1</id>
      <refName>wildrose</refName>
      <description>Special Seed for beautiful wild roses</description>
      <category>wildrose</category>
      <country>china</country>
  </seed>
</Flower>

我假设类的不同结构足以让jaxb区分对象。 我担心我必须使用适配器,但我希望有人有另一个好主意。

我知道有一个与我相似的话题。但是主题中的类型看起来很相似,所以jaxb无法区分它们。 (JAXB @XmlElements, different types but same name?

谢谢,抱歉我的英语不好。

编辑:有没有办法通过编组添加类型,jaxb确切地知道它是什么类型的解组?

1 个答案:

答案 0 :(得分:0)

@XmlElements中不能有相同的名称。代码不会编译。您可以使用@XmlSeeAlso,但这不是正确的方法。 @XmlSeeAlso用于子类,但在这种情况下它可以工作。

只有当您知道

中设置的类的类型时,此解决方案才会进行锻炼
  

flower.object

@XmlRootElement(name = "Flower")
@XmlSeeAlso({Seed.class,Reference.class})
@XmlAccessorType(XmlAccessType.FIELD)
public class Flower extends CommonElements {
    public Flower(){}

    public Flower(String id, String name){
        super(id,name);
    }
    @XmlAttribute
    private String color;
    @XmlElement
    public Object seed;

    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
}

<Flower>
    <id>2</id>
    <refName>redRose</refName>
    <color>RED</color>
    <seed xsi:type="seed" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <id>1</id>
        <refName>wildrose</refName>
        <category></category>
        <country>USA</country>
    </seed>
</Flower>

<Flower>
    <id>3</id>
    <refName>whiteRose</refName>
    <color>white</color>
    <seed xsi:type="reference" href="www.google.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</Flower>