[英]Unmarshal element attribute and text to separate fields with jaxb
如何注釋Root
類中的externalValue
和companyId
字段,以便將“abc”映射到externalValue
並將“123”映射到companyId
?
我需要@XmlJavaTypeAdapter
注釋嗎? 在哪里? 我希望如果我這樣做,它可以只處理這兩個字段,並且我可以按原樣保留title
和國家/ countryCodes
的注釋。
<item>
<externalValue companyId="123">abc</externalValue>
<title>My Title</title>
<country>US</country>
<country>CA</country>
</item>
@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;
您必須以下列方式定義類。
@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.