关于根元素的Jaxb问题

时间:2011-03-28 18:40:24

标签: java xml jaxb

我需要创建一些xml以发送到以下格式的另一个应用程序,我正在尝试使用jaxb。总是只出现一次吧。有没有办法做到这一点,或者它是无效的xml,因为它有2个根元素,而另一个应用程序需要更改它接受xml的方式?

<FOO>
 <BAR>
  <id>1</id>
  <POINTS>111</POINTS>
  <CODE>123</CODE>
 </BAR>
</FOO>

1 个答案:

答案 0 :(得分:1)

以下是几种方法:

标准JAXB

以下内容适用于任何JAXB实现(Metro,MOXy,JaxMe等)。您可以创建元素“ FOO ”,然后将Bar的实例封送到其中。下面的代码如何使用StAX演示(也可以使用DOM或SAX):

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLOutputFactory xof = XMLOutputFactory.newFactory();
        XMLStreamWriter xsw = xof.createXMLStreamWriter(System.out);
        xsw.writeStartDocument();
        xsw.writeStartElement("FOO");

        Bar bar = new Bar();
        bar.setId(1);
        bar.setPoints(111);
        bar.setCode(123);

        JAXBContext jc = JAXBContext.newInstance(Bar.class);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
        marshaller.marshal(bar, xsw);

        xsw.writeEndElement();
        xsw.writeEndDocument();
        xsw.close();
    }

}

EclipseLink JAXB(MOXy)

如果您正在使用EclipseLink JAXB (MOXy),那么您可以使用@XmlPath扩展(我是MOXy技术主管)。您的Bar类看起来像:

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="FOO")
@XmlType(propOrder={"id", "points", "code"})
public class Bar {

    private int id;
    private int points;
    private int code;

    @XmlPath("BAR/id/text()")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @XmlPath("BAR/POINTS/text()")
    public int getPoints() {
        return points;
    }

    public void setPoints(int points) {
        this.points = points;
    }

    @XmlPath("BAR/CODE/text()")
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

}

有关详细信息,请参阅: