簡體   English   中英

JAXB - 在編組XML時可以將類包含展平嗎?

[英]JAXB - can class containment be flattened when marshalling to XML?

說,我有兩個班:

@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中看到它們的方式構建字段。 有沒有更好的辦法?

對我來說已經有一段時間了,但是讓我給它一個裂縫:

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

編輯:免責聲明 - 我沒有編譯或試過這個。 但我相信你是這樣做的。

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

欲獲得更多信息

另一種方法(使用標准JAXB)將使用@XmlJavaTypeAdapter 這樣,您可以調整對象層次結構,其缺點是必須編寫將對象層次結構轉換為適應的新類的代碼。 在你的例子中,它不會起作用,因為你必須適應作為你的根的A類。 但是,如果層次結構更深,並且您需要使適應性比根低一級,則不會出現問題。 一個可能有用的建議是在適應的實體中編寫代碼,使其成為對象層次結構的委托,而不是適配器,后者將非常薄。

看一下這個問題和建議的解決方案: Spring RESTful client:root標簽異常

非常有助於解決這類問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM