[英]XML:JAXB Mapping Java Objects and XML Document
我正在嘗試實現所有Java類來處理以下XML代碼段:
<party date="2012-09-30">
<guest name="Albert">
<drink>wine</drink>
</guest>
</party>
我寫了3節課:
Party.java:
package li.mnet.www.java.xml;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "party")
public class Party {
@XmlAttribute(name = "date")
private String partyDate;
public Party() {}
public String getPartyDate() {return partyDate;}
public void setPartyDate(String partyDate) {
this.partyDate = partyDate;
}
}
Guest.java:
package li.mnet.www.java.xml;
import javax.xml.bind.annotation.XmlElement;
public class Guests {
private String name;
public Guests() {}
public void setGuestName(String name) {this.name = name;}
@XmlElement(name = "name")
public String getGuestName() {return name;}
}
PartyRunner.java:
package li.mnet.www.java.xml;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class PartyRunner {
public static void main(String[] args) {
Party party = new Party();
Guests guest = new Guests();
party.setPartyDate("2012-09-03");
guest.setGuestName("Albert");
JAXBContext context;
try {
context = JAXBContext.newInstance(Party.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(party, System.out);
} catch (JAXBException e) {e.printStackTrace();}
}
}
運行該應用程序后,我得到以下控制台輸出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<party date="2012-09-03"/>
我必須更改什么,該類Guest.java也會被打印出來?
謝謝你的幫忙!
我認為聚會班級應包含一位客人(如果需要,還可以包含一位客人的名單)
public class Party {
@XmlAttribute(name = "date")
private String partyDate;
private Guest guest;
public Party() {}
public String getPartyDate() {return partyDate;}
public void setPartyDate(String partyDate) {
this.partyDate = partyDate;
}
// getter and setter for guest
}
設置派對對象的客人,然后封送派對對象。
還要在名稱的來賓類中將XmlElement注釋更改為XmlAttribute。
當您嘗試通過JAXB封送一些數據時,將為它提供一個類的實例(這里是Party),它將遍歷您的對象及其所有屬性,並嘗試使用提供的提示將它們序列化為最終輸出由JAXB批注。
請記住,JAXB會忽略沒有JAXB批注的類的屬性。 您還可以判斷是為給定的類屬性生成XML Element
還是XML Attribute
。 您可以在屬性或其getter
方法上使用這些注釋。
在您的示例中,您希望在party
元素內包含一個guest
元素。 在您的main
方法中(在PartyRunner
),您正在PartyRunner
Party
類的一個實例,但是該類沒有引用Guests
類。 創建Guests
類的實例還不夠。 您必須在兩個類之間創建邏輯關系並對其進行批注,以使其能夠生成適當的XML。 所以您的Party
班級應該是這樣的:
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "party")
public class Party {
@XmlAttribute(name = "date")
private String partyDate;
@XmlElement(name="guest")
private Guests guests;
public Party() {}
public String getPartyDate() {return partyDate;}
public void setPartyDate(String partyDate) {
this.partyDate = partyDate;
}
public Guests getGuests() {
return guests;
}
public void setGuests(Guests guests) {
this.guests = guests;
}
}
如果再次運行PartyRunner
,則輸出中將顯示以下內容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<party>
<partyDate>2012-09-03</partyDate>
<guest>
<name>Albert</name>
</guest>
</party>
如您所見, guests
元素中有一個名為name
的內部元素。 這是由於您為Guests
類中的getGuestName
方法指定了注釋。 為了使JAXB能夠為此屬性生成XML屬性(而不是XML元素),您還需要在Guests
類中更改JAXB批注。 您已將getGuestName
方法注釋為@XmlElement
。 這將導致生成XML元素。 如果將其更改為@XmlAttribute
並再次運行PartyRunner
,則輸出中將包含以下內容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<party date="2012-09-03">
<guest name="Albert"/>
</party>
同樣,在示例XML中, guests
屬性中有一個drink
元素。 drink
財產也是如此。 該drink
可以是您的Guests
類中的String
屬性,其注釋為@XmlAttribute(name = "drink")
。 因此,用於生成問題開頭提到的XML的最終Guests
類應該是這樣的:
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
public class Guests {
private String name;
private String drinkType;
public Guests(){}
public void setGuestName(String name) {this.name = name;}
@XmlAttribute(name = "name")
public String getGuestName() {return name;}
@XmlElement(name = "drink")
public String getDrinkType() {
return drinkType;
}
public void setDrinkType(String drinkType) {
this.drinkType = drinkType;
}
}
和你的PartyRunner
應該在初始化drink
屬性像wine
:
public static void main(String[] args) {
Party party = new Party();
Guests guest = new Guests();
party.setPartyDate("2012-09-03");
guest.setGuestName("Albert");
guest.setDrinkType("wine");
party.setGuests(guest);
JAXBContext context;
try {
context = JAXBContext.newInstance(Party.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(party, System.out);
} catch (JAXBException e) {e.printStackTrace();}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.