2011-03-28 67 views
1

我需要创建一些xml以下面的格式发送到另一个应用程序,我试图使用jaxb。总是只有一次出现吧。有没有办法做到这一点,或者它是无效的XML,因为它有2个根元素和其他应用程序将需要改变它如何接受XML?关于根元素的Jaxb问题

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

这是完全有效的。你有什么问题? – skaffman 2011-03-28 18:49:01

+0

对,它没有2个根(是根元素)。但是对于JAXB,如果有属性“BAR”没有列表,那么JAXB将无法弄清楚如何使用这样的XML。 – StaxMan 2011-03-28 18:58:40

+0

根据我的规格,这是我应该发送的确切的XML,我无法找到一种方法来获取XML在酒吧。条形图中只有1个元素出现。 – Scott 2011-03-28 19:02:31

回答

1

下面是几个方法:

标准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; 
    } 

} 

欲了解更多信息,请参阅:

+0

我使用第一个代码示例正确地获得了正确的xml格式,现在我只需要弄清楚如何将XMLStreamWriter与我预期的xml进行比较,以便我的测试通过。谢谢您的帮助! – Scott 2011-03-28 19:38:48

+0

@Scott - 没问题,如果这回答了您的问题,请考虑将其标记为接受的答案。这标记给其他用户,你已经找到了你正在寻找的答案。 – 2011-03-28 19:47:43