我需要创建一些xml以发送到以下格式的另一个应用程序,我正在尝试使用jaxb。总是只出现一次吧。有没有办法做到这一点,或者它是无效的xml,因为它有2个根元素,而另一个应用程序需要更改它接受xml的方式?
<FOO>
<BAR>
<id>1</id>
<POINTS>111</POINTS>
<CODE>123</CODE>
</BAR>
</FOO>
答案 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;
}
}
有关详细信息,请参阅: