2011-07-24 46 views
2

我有XML如下:JAXB Unmarshalling多态对象 - 集合?

<Temp NAME="bobo"> 
    <elem1 /> 
    <elem2> 
     <Attri1 ID="123" /> 
    </elem2> 
    <elem3> 
     <Attri2 MOM="9" ID="7" SSS="2" /> 
    </elem3> 
    <elem3> 
     <Attri3 MOM="44" ID="4" DSC="First Test"/> 
    </elem3> 
</Temp> 

我使用注释映射到Java类:

@XmlRootElement(name = "Temp") 
public class Temp { 

    @XmlElements({ 
     @XmlElement(name="elem1",type=elem.class), 
     @XmlElement(name="elem2",type=elem.class)}) 
    public ArrayList<elem> elms; 
} 

public class elem { 
... 
} 

public class elem1 extends elem{ 
... 
} 

public class elem2 extends elem{ 
... 
} 

public class elem3 extends elem{ 
... 
} 

在每个元素可以有许多属性。

有人可以帮助我如何正确注释java类吗?

让我磨一下我的问题。 我需要从这个XML构建一个java对象,这些对象将有三个参数:第一个元素的名称(p1),子元素的名称(p2),地图值(p3)。

上面的XML将生成4个的java对象ELEM如下:

所有Java对象类型是ELEM!

OBJ1:

p1 = elem1 
p2 = null 
p3 = null 

OBJ2:

p1 = elem2 
p2 = Attri1 
p3 = map: key value 
      (ID, 123) 

OBJ3:

p1 = elem3 
p2 = Attri2 
p3 = map: key value 
      (MOM, 9) 
      (ID, 7) 
      (SSS, 2) 

OBJ4:

p1 = elem3 
p2 = Attri3 
p3 = map: key value 
      (MOM, 44) 
      (ID, 4) 
      (DSC, First Test) 

提前感谢! 鲍里斯。

+0

好吧,那么当你尝试你有什么会发生什么? – skaffman

+0

事情是我现在没有如何正确地处理属性 例如在elem2中有属性名'attri1'它也可以是一些其他属性,需要现在属性的名称,然后它的值.. 每个属性都是不同的对象。 – boris

回答

0

那么,您需要为您的xml涵盖所有情况的模式定义。如果确实需要动态结构,则需要使用键值&值对以不同方式构建它。对于前:

<属性>

<name >ID</name > 
<value > 123</value > 

OR

<属性名= “ID” 值= “123”>

这会给你的集合每个元素的属性。这可以在您的模式中表示。一旦你有了架构,你可以生成或创建你的对象

+0

我没有chema定义为我的xml。 我需要使用这个XML,因为这个输入我的应用程序需要与 – boris

+0

一起工作在这种情况下,考虑DOM解析器,您可以在内部将它们转换为键/值对,如您提到的对象。对于JAXB,据我所知,它映射到一个模式。 – isobar

+0

Queation - 我怎样才能将p1(由xml生成的elem java对象)值设置为第一个元素的名称 - elem1?这是我需要添加到elem类使用注释.. 这样的事情: public class elem { XmlAttribute public String p1; XmlAttribute public String p2; public Map p1; } – boris