JAXB - 在编组XML时可以将类包含展平吗?

时间:2011-12-02 19:37:59

标签: java xml annotations jaxb

说,我有两个班:

@XmlRootElement
class A {
    @XmlElement
    String propertyOfA;
    @XmlElement
    B b;
}

class B {
    @XmlElement
    String propertyOfB;
} 

JAXB返回以相应方式格式化的XML:

<a>
  <propertyOfA>valueA</propertyOfA>
  <b>
    <propertyOfB>valueB</propertyOfB>
  </b>
</a>

我的问题是如何在XML中展平层次结构?所以我有:

<a>
  <propertyOfA>valueA</propertyOfA>
  <propertyOfB>valueB</propertyOfB>
</a>

这可以通过注释完成吗?

目前我正在考虑为A创建一种包装类,这将使我希望在XML中看到它们的方式构建字段。还有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

对我来说已经有一段时间了,但让我试试看:

@XmlRootElement
class A {
    @XmlElement
    String propertyOfA;
    @XmlElement(name="propertyOfB")
    B b;
}
@XmlType(name="")
class B {
    @XmlValue
    String propertyOfB;
} 

编辑:免责声明 - 我没有编译或试过这个。但我相信你是这样做的。

答案 1 :(得分:4)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。

您可以使用MOXy的@XmlPath扩展名来映射此用例:

import java.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
class A {
    @XmlElement
    String propertyOfA;

    @XmlPath(".")
    B b;
}

了解更多信息

答案 2 :(得分:0)

看看那个问题和建议的解决方案:Spring RESTful client: root tag exception

非常有助于解决此类问题。

答案 3 :(得分:0)

另一种方法(使用标准JAXB)将使用@XmlJavaTypeAdapter。这样,您可以调整对象层次结构,其缺点是必须编写将对象层次结构转换为适应的新类的代码。 在你的例子中,它不会起作用,因为你必须适应作为你的根的A类。但是,如果层次结构更深,并且您需要使适应性比根低一级,那么就不会有问题。一个可能有用的建议是在适应的实体中编写代码,使其成为对象层次结构的委托,而不是适配器,后者将非常薄。