簡體   English   中英

如何在 JAXB 編組期間將包裝器元素添加到 class

[英]How to add wrapper element to class during the JAXB marshalling

我正在嘗試使用Moxy Marshalling方法創建XML 除了一件小事外,一切似乎都運行良好。 基本上,我想知道如何在編組過程中將包裝元素添加到 class 本身。

正如我們所知,我們可以添加@XmlPath("test/name/text()")以將包裝器添加到任何String元素。 同樣對於收集,我們可以使用@XmlElementWrapper(name="languages")@XmlElement(name="language") 但這些適用於class中的字段。 如何將包裝器元素添加到正在編組的 class 本身?

我有以下 class:

@XmlRootElement(name = "customer")
@XmlType(name="customer",propOrder={"name","languages"})
@XmlAccessorType(XmlAccessType.FIELD)   
public class Customer{
    
    @XmlPath("extension/name/text()")
    private String name;
    
    @XmlElementWrapper(name = "languages")
    @XmlElement(name = "language")
    private List<String> languages;
    
    //Getter, Setter and other constuctors
}

這將產生 output XML如下所示:

<customer>
    <extension>
        <name>Hello</name>
    </extension>
    <languages>
        <language>English</language>
        <language>UK English</language>
    </languages>
</customer>

但是,我想添加wrapper元素來事件整個 class 以便 output 看起來像這樣:(注意整個customerclassWrapper中的包裝器)

<classWrapper>
    <customer>
        <extension>
            <name>Hello</name>
        </extension>
        <languages>
            <language>English</language>
            <language>UK English</language>
        </languages>
    </customer>
</classWrapper>

我嘗試將@XmlPath@XmlElementWrapper添加到Customer class 但它會引發錯誤,因為它只能添加到 class 中的字段,但不能添加到整個 ZA2F2ED4F8EBC2CBB4C21A29DC40AB61。

以下是我的Main class 將用於編組:

public class HelloWorld{

     public static void main(String []args){
        Customer customer = new Customer();
        
        List<String> languages = new ArrayList<String>();
        languages.add("English");
        languages.add("UK English");
        
        customer.setName("Hello");
        customer.setLanguages(languages);
        
        JAXBContext context = JAXBContext.newInstance(Customer.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(customer,System.out);
     }
}

我知道我可以編寫另一個wrapper class 向其中添加自定義字段,然后使用該wrapper class 進行marshalling 實際上,我現在正在做同樣的事情。 但是,嘗試查找是否有一些Moxy方法來執行此操作,類似於我們使用@XmlPath@XmlElementWrapper的方式

有人可以建議某種形式的Moxy Jaxb相關方法來實現整個 class 的包裝器元素嗎?

這是一個臨時的解決方法,對我來說可以按預期工作。 在這里發布答案,以便將來對某人有所幫助。

  1. @XmlRootElement("customer")更改為@XmlRootElement("classWrapper") 所以你會得到classWrapper作為外部元素。

  2. 然后使用@XmlPath更改Customer class 中的所有元素,以便Customer標簽下的所有元素 go 。 所以總體customer.class看起來像這樣:

    @XmlRootElement(name = "classWrapper")
    @XmlType(name="customer",propOrder={"name","languages"})
    @XmlAccessorType(XmlAccessType.FIELD)
    @Getter
    @Setter
    public class Customer{
    
      @XmlPath("customer/extension/name/text()")
      private String name;
    
      @XmlPath("customer/languages/language/text()")
      private List<String> languages;
    
      //Getter, Setter and other constuctors
    }

使用@XmlPath時的提示:如果text()不是簡單類型,例如 String、Date 等類型,請不要使用它。

例如,如果元素是帶有ListCustom類型,則不要使用/text()

@XmlPath("extension/elements/element")
List<myType> elements;

這將添加extension -> elements -> element ,然后是內容。

<extension>
<elements>
<element></element>
<element></element>
......
</elements>
</extension>

如果元素是String類型,那么您必須使用text()

@XmlPath("extension/elements/text()")
List<String> elements;

暫無
暫無

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

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