2013-04-29 226 views
1

xml具有相同名稱和不同類型的元素

我有一個xmlelement,它可以來自不同的類型。獨立於類型,它具有相同的名稱。它可以是一個對象,或者是一個通過URI指向現有對象的引用。我認爲xmlElements可能是解決方案。編組工作正常,但通過解組,它每次選擇最後一個給定的類類型。

的Class花含有元素

@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,de scription等。 的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確切知道它是用於解組的類型?

回答

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> 
+0

MHM ..編譯相同的名稱設置類的類型和整理完善。但你的解決方案工作正常。就像你說xmlseealso是爲了別的東西..所以它似乎有點骯髒..但只要它的作品,它對我來說很好。 :) – nsrlady 2013-04-29 14:01:07

+0

很奇怪。對於我在日食juno與JDK6它給編譯錯誤。 – Chandru 2013-05-07 06:36:54

+0

mhm ..現在我得到[com.sun.istack.internal.SAXException2:「Seed」的實例將替換爲「java.lang.Object」,但「Seed」綁定到一個匿名類型。] – nsrlady 2013-05-14 08:57:49

相關問題