2011-03-28 73 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