2011-11-03 60 views
1

这是我的课:Bar如何在JAXB中编组解包的集合?

@XmlRootElement(name = "foo") 
@XmlAccessorType(XmlAccessType.NONE) 
public class Foo { 
    @XmlElement 
    public Collection getElements() { 
    List elements = new ArrayList(); 
    elements.add(new Bar); 
    elements.add(new Bar); 
    return elements; 
    } 
} 

类也很简单:

@XmlType(name = "bar") 
@XmlAccessorType(XmlAccessType.NONE) 
public static final class Bar { 
    @XmlElement 
    public String getMessage() { 
    return "hello, world!"; 
    } 
} 

这就是我的Foo编组后得到:

<foo> 
    <elements xsi:type="foo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <message>hello, world!</message> 
    </elements> 
    <elements xsi:type="foo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <message>hello, world!</message> 
    </elements> 
</foo> 

虽然我期待得到:

<foo> 
    <bar> 
    <message>hello, world!</message> 
    </bar> 
    <bar> 
    <message>hello, world!</message> 
    </bar> 
</foo> 

我该怎么修复?

回答

3

您将需要@XmlElement(name="bar")签注elements属性:

@XmlRootElement(name = "foo") 
@XmlAccessorType(XmlAccessType.NONE) 
public class Foo { 
    @XmlElement(name="bar") 
    public Collection getElements() { 
    List elements = new ArrayList(); 
    elements.add(new Bar); 
    elements.add(new Bar); 
    return elements; 
    } 
} 
+0

但我想从他们的'@ XmlType'注解使用他们的名字。我不想在'Foo'类中复制这个声明...可能吗?而且,在现实生活中,我不知道他们的名字是什么。 – yegor256

+2

@ yegor256 - 您可以利用“@ XmlRootElement”注释的值,而不是“@ XmlType”注释的值。如果集合的值涉及继承层次结构,则可以使用'@ XmlElementRef'注释:http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html。如果它们不相关,则可以使用'@XmlAnyElement(lax = true)'注释:http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html –

+1

'@ XmlAnyElement'正是我所期待的,非常感谢博客链接! – yegor256