我需要创建一些xml以下面的格式发送到另一个应用程序,我试图使用jaxb。总是只有一次出现吧。有没有办法做到这一点,或者它是无效的XML,因为它有2个根元素和其他应用程序将需要改变它如何接受XML?关于根元素的Jaxb问题
<FOO>
<BAR>
<id>1</id>
<POINTS>111</POINTS>
<CODE>123</CODE>
</BAR>
</FOO>
我需要创建一些xml以下面的格式发送到另一个应用程序,我试图使用jaxb。总是只有一次出现吧。有没有办法做到这一点,或者它是无效的XML,因为它有2个根元素和其他应用程序将需要改变它如何接受XML?关于根元素的Jaxb问题
<FOO>
<BAR>
<id>1</id>
<POINTS>111</POINTS>
<CODE>123</CODE>
</BAR>
</FOO>
下面是几个方法:
标准JAXB
下面将与任何JAXB实现(地铁,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(莫西)
如果你碰巧使用EclipseLink JAXB (MOXy),那么你就可以使用@XmlPath扩展名(我是MOXy技术领导者)。你的酒吧类会是什么样子:
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;
}
}
欲了解更多信息,请参阅:
我使用第一个代码示例正确地获得了正确的xml格式,现在我只需要弄清楚如何将XMLStreamWriter与我预期的xml进行比较,以便我的测试通过。谢谢您的帮助! – Scott 2011-03-28 19:38:48
@Scott - 没问题,如果这回答了您的问题,请考虑将其标记为接受的答案。这标记给其他用户,你已经找到了你正在寻找的答案。 – 2011-03-28 19:47:43
这是完全有效的。你有什么问题? – skaffman 2011-03-28 18:49:01
对,它没有2个根(是根元素)。但是对于JAXB,如果有属性“BAR”没有列表,那么JAXB将无法弄清楚如何使用这样的XML。 –
StaxMan
2011-03-28 18:58:40
根据我的规格,这是我应该发送的确切的XML,我无法找到一种方法来获取XML在酒吧。条形图中只有1个元素出现。 – Scott 2011-03-28 19:02:31