簡體   English   中英

XML:JAXB映射Java對象和XML文檔

[英]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.

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