2011-04-25 65 views
4

我想知道是否有可能将xml元素解组到多个pojos。例如:JAXB unmarshall到多个pojo的

用于XML:

<type> 
    <id>1</id> 
    <cost>12</cost> 
    <height>15</height> 
    <width>13</width> 
    <depth>77</depth> 
</type> 

Item类

@XmlAccessorType(XmlAccessType.PROPERTY) 
@XmlRootElement(name="type") 
public class Item { 
    private Integer id; 
    private Double cost; 

    @XmlElement(name="id") 
    public Integer getId(){ 
    return id; 
    } 

    @XmlElement(name="cost") 
    public Double getCost(){ 
    return cost 
    } 
} 

ItemDimensions类

@XmlAccessorType(XmlAccessType.PROPERTY) 
@XmlRootElement(name="type") 
public class ItemDimensions { 
    private Integer height; 
    private Integer width; 
    private Integer depth; 

    @XmlElement(name="height") 
    public Integer getHeight(){ 
    return height; 
    } 

    @XmlElement(name="width") 
    public Integer getWidth(){ 
    return width; 
    } 

    @XmlElement(name="depth") 
    public Integer getDepth(){ 
    return depth; 
    } 
} 

我曾尝试使用许多由产生JAXB映射来完成类似的东西Netbeans 6.9和一些测试类,但现在已经得到了。有谁知道这是否可以在没有任何中介对象的情况下完成?

+0

AFAIK您将不得不自己创建ItemDimensions对象。例如返回新的ItemDimensions(高度,宽度,深度)。 – nabeelmukhtar 2011-04-25 15:13:45

回答

2

您可以使用@XmlPath扩展在EclipseLink JAXB (MOXy)来完成这个用例(我是莫西技术主管):

JAXB需要一个对象来解组,我们将介绍一个班级来完成这个角色。这个类必须与您要散集与自我的XPath注释两个对象的字段:(“”)@XmlPath

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

import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="type") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    @XmlPath(".") 
    private Item item; 

    @XmlPath(".") 
    private ItemDimensions itemDimensions; 

} 

ItemDimensions

您正常注释这个类。在你的例子中你注释了属性,但只提供getters。这将导致JAXB认为这些是只写映射。

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class ItemDimensions { 

    private Integer height; 
    private Integer width; 
    private Integer depth; 

} 

项目

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Item { 

    private Integer id; 
    private Double cost; 

} 

演示

import java.io.File; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     Unmarshaller u = jc.createUnmarshaller(); 
     Object o = u.unmarshal(new File("input.xml")); 

     Marshaller m = jc.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     m.marshal(o, System.out); 
    } 

} 

jaxb.properties

要使用莫西为您的JAXB实现,您必须提供一个名为jaxb.properties的文件与您的域对象与以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 
+0

+1我不明白“注释只写属性的getter”部分,你可以详细说明还是重定向到链接? – ekeren 2011-04-25 15:51:45

+0

@ekeren - 如果使用PROPERTY访问并且未提供setter,那么在解组期间,JAXB实现将无法“设置”对象上的值。一个解决方案是提供一个setter,另一个是使用FIELD访问。 – 2011-04-25 15:54:22

+0

+1刚刚我刚才也是。 – andyb 2011-06-10 15:08:30