2011-03-28 4 views
1

아래 양식으로 다른 응용 프로그램으로 보내려면 xml을 만들어야하고 jaxb를 사용하려고합니다. 항상 막대가 하나만 나타납니다. 이를 수행하는 방법이 있습니까 아니면 2 x 루트 요소가 있고 다른 응용 프로그램이 xml을 받아들이는 방식을 변경해야하기 때문에 xml이 유효하지 않습니까?루트 요소에 대한 Jaxb 질문

표준 JAXB

다음은 어떤 JAXB 구현 (지하철, MOXy, JaxMe 등)와 함께 작동합니다 :

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

이 완벽하게 유효합니다. 무슨 문제 있니? – skaffman

+0

맞아요. 루트가 2 개 있지 않습니다 (은 루트 요소입니다). 그러나 JAXB에 관해서는 목록을 사용하지 않는 속성 "BAR"이있는 경우 JAXB는 이러한 XML 사용 방법을 알 수 없습니다. – StaxMan

+0

스펙에 따르면 정확한 xml을 전송해야하며 xml에 바를 가져 오는 방법을 찾을 수 없습니다. 막대에 3 개의 요소가 1 번만 나타납니다. – Scott

답변

1

아래는 접근 방식의 몇 가지 있습니다. "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

첫 x 째 코드 예제를 사용하여 올 Y 른 xml 형식을 얻었으므로 XMLStreamWriter를 예상 xml과 비교하여 테스트를 통과 할 수 있습니다. 도와 주셔서 감사합니다! – Scott

+0

@Scott - 문제가되지 않습니다. 귀하의 질문에 대답이 있으면 대답을 받아 들일 것을 고려하십시오. 이 플래그는 찾고있는 답을 찾은 다른 사용자에게 표시합니다. –