2010-06-30 70 views
12

我想知道是否有可能讓JAXB不創建用於作爲包裝器的XML元素的Java對象。例如,對於以下結構處理JAXB中的嵌套元素

<root> 
    <wrapper> 
     <entity/> 
    </wrapper> 
</root> 

的XML我不想一個對象<wrapper>在所有被創建。因此,對於像

class Root { 
    private Entity entity; 
} 

一類<entity>元素應該被直接解組到實體領域。

使用JAXB可以實現嗎?

+0

在你的榜樣,''不會在所有產生。請發佈重現問題的示例代碼。 – skaffman 2010-06-30 14:21:17

+0

讓我改述一下:我如何對提供的類進行註釋,以便所描述的結構的XML可以被解組? – fnt 2010-06-30 14:34:34

+0

這並不好。目前還不清楚你想要做什麼。我們需要一個例子。 – skaffman 2010-06-30 19:56:33

回答

6

雖然它需要額外的編碼,所需的解組可以做到使用瞬態包裝對象是這樣的:

@XmlRootElement(name = "root") 
public class Root { 

    private Entity entity; 

    static class Entity { 

    } 

    static class EntityWrapper { 
     @XmlElement(name = "entity") 
     private Entity entity; 

     public Entity getEntity() { 
      return entity; 
     } 
    } 

    @XmlElement(name = "wrapper") 
    private void setEntity(EntityWrapper entityWrapper) { 
     entity = entityWrapper.getEntity(); 
    } 

} 
+0

它似乎確定,但我認爲它只是解開對象,即從包裝分配N個屬性到新的Root對象。有點麻煩的解決方案... – 2015-09-12 17:56:58

+1

@MichałZiobro您可以自由提供您自己的解決方案,這不是繁瑣的 – fnt 2017-03-07 17:59:22

-2

JAXB或其他映射系統的要點是將元素及其層次映射到類。在你的例子中,你似乎希望JAXB以某種方式知道它可以將實體編組爲包裝器/實體,反之亦然,而不需要實際創建用於包裝器映射的類以及根和實體之間的連接。如所呈現的那樣,這大致相當於詢問如何在沒有驅動軸的情況下將汽車發動機連接到車輪。

所以,除非我缺少重點,否則答案是否定的 - JAXB或任何其他映射程序都不能執行此操作。你可以通過使用純粹動態映射的東西來避免創建類(參見Groovy,GPath的例子),但是避免了創建所有類,而不是跳過層次結構中的一箇中間層。

+2

正如Doug Clarke所解釋的,這可以使用EclipseLink MOXy完成。 – 2010-08-05 20:37:08

+0

這個答案太具有誤導性。這是完全可能的,執行所需的unmarshalling - http://stackoverflow.com/a/3155877/318054 – fnt 2017-03-07 23:28:50

5

EclipseLink MOXy提供JAXB 2.2的實現進行了擴展。其中一個擴展功能是使用XPath瀏覽XML領域模型中不需要的XML層。

如果你看看:

http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/MOXyExtensions

你會發現,客戶的名字存儲內,但該名稱是客戶的字符串屬性。這是通過使用來實現:

@XmlPath("personal-info/name/text()") 
public String getName() { 
    return name; 
} 

我希望這有助於

道格

+0

謝謝你提到這一點。我正在考慮以某種方式使用XPath,很高興知道這是一個隨時可用的實現。 – fnt 2010-07-05 07:49:59

+3

EclipseLink的附加映射靈活性非常好。我也非常喜歡開發人員在外部映射文件中支持XML綁定而不是僅通過註釋完成的工作。這允許域模型映射到多個XSD,版本以及不同的數據源,沒有任何混亂 – 2010-07-05 17:00:35