0

我正在尝试实现所有 Java 类来处理以下 XML 代码片段:

<party date="2012-09-30"> 
    <guest name="Albert"> 
      <drink>wine</drink> 
    </guest>
</party>

我写了 3 个类:

派对.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;
    }
}

来宾.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 类也被打印出来了?

非常感谢你的支持!

4

2 回答 2

0

我认为派对课程应该包含一位客人(或者如果你想要更多的客人名单)

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。

于 2013-10-06T21:53:28.287 回答
0

当你试图通过 JAXB 编组一些数据时,你会给它一个你的类的实例(这里是 Party),它会遍历你的对象及其所有属性,并尝试使用提供的提示将它们序列化到最终输出通过 JAXB 注释。

请记住,JAXB 会忽略没有 JAXB 注释的类的属性。您还可以判断是否生成XML ElementXML Attribute为给定的类属性。您可以在属性或其getter方法上使用这些注释。

在您的示例中,您希望在元素中有一个guest元素party。在您的main方法 (in 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>

如您所见,name您的元素中有一个内部guests元素。这是由于您为类中的getGuestName方法指定的注释Guests。为了使 JAXB 为该属性生成 XML 属性(而不是 XML 元素),您还需要更改Guests类中的 JAXB 注释。getGuestName您已将该方法注释为@XmlElement. 这将导致生成一个 XML 元素。如果您将其更改为@XmlAttributePartyRunner再次运行,您将在输出中包含以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<party date="2012-09-03">
    <guest name="Albert"/>
</party>

同样在您的示例 XML 中,您的属性中有一个drink元素。财产guests也是如此。可能是您的类中注释为drink的属性。因此,生成问题开头提到的 XML 的最终类应该是这样的:drinkStringGuests@XmlAttribute(name = "drink")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初始化为:drinkwine

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();}
}
于 2013-10-06T22:12:17.233 回答