簡體   English   中英

解組元素屬性和文本以使用 jaxb 分隔字段

[英]Unmarshal element attribute and text to separate fields with jaxb

如何注釋Root類中的externalValuecompanyId字段,以便將“abc”映射到externalValue並將“123”映射到companyId
我需要@XmlJavaTypeAdapter注釋嗎? 在哪里? 我希望如果我這樣做,它可以只處理這兩個字段,並且我可以按原樣保留title和國家/ countryCodes的注釋。

XML:

<item>
    <externalValue companyId="123">abc</externalValue>
    <title>My Title</title>
    <country>US</country>
    <country>CA</country>
</item>

POJO:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
    private String externalValue;
    private String companyId;
    @XmlElement
    private String title;
    @XmlElement(name = "country")
    public List<String> countryCodes;

    // getters and setters...
}

恐怕這在一般情況下(即 JAXB 規范)僅使用注釋(因此沒有額外的 POJO 和一些適配器)是不可能實現的。 但是,如果您碰巧使用 MOXy 作為 JAXB 實現,則很容易添加注釋@XmlPath如下所示:

@XmlPath("externalValue/@companyId")
private String companyId;

相關問題:使用 Xpath 表達式和 jaxb 解組 XML

您必須以下列方式定義類。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {

    private CompanyIdValue companyIdValue;
    @XmlElement
    private String title;

    @XmlElement(name = "country")
    public List<String> countryCodes;

    //getter and setter
}

如果 XML 元素標記中有兩個屬性,則必須定義一個單獨的類。 定義一個名為CompanyIdValue的單獨類,對於 XML 元素,您必須定義@XmlValue並且對於您必須使用@XmlAttribute注釋的屬性

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;
public class CompanyIdValue {

    @XmlElement(name = "externalValue")
    private String externalValue;

    private String companyId;

    public String getExternalValue() {
        return externalValue;
    }

    @XmlValue
    public void setExternalValue(String externalValue) {
        this.externalValue = externalValue;
    }

    public String getCompanyId() {
        return companyId;
    }

    @XmlAttribute
    public void setCompanyId(String companyId) {
        this.companyId = companyId;
    }
}

我在下面提供了一個測試程序也用於測試。

public class Test {
  public static void main(String[] args) {
    try {
      Item item = new Item();
      CompanyIdValue companyIdValue = new CompanyIdValue();
      companyIdValue.setCompanyId("SomeId");
      companyIdValue.setExternalValue("Some External value");
      item.setCompanyIdValue(companyIdValue);
      item.setCountryCodes(Arrays.asList("A", "B"));
      item.setTitle("Some Title");

      JAXBContext jaxbContext = JAXBContext.newInstance(Item.class);
      Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
      jaxbMarshaller.marshal(item, System.out);

    } catch (JAXBException e) {
      e.printStackTrace();
    }
  }
}

暫無
暫無

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

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