【问题标题】:JAXB - can class containment be flattened when marshalling to XML?JAXB - 编组为 XML 时可以展平类包含吗?
【发布时间】:2012-01-11 19:05:41
【问题描述】:

说,我有两个班:

@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 中看到它们的方式构建字段。有没有更好的办法?

【问题讨论】:

    标签: java xml annotations jaxb


    【解决方案1】:

    注意:我是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;
    }
    

    更多信息

    【讨论】:

    • 我最终使用了这个,它有效。而且我认为 XmlPath 会变得很方便。
    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

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

    对解决这类问题很有帮助。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多