2011-12-06 6 views
1

JAXB를 사용하여 Java 객체를 XML로 마샬링하는 방법을 배우기 시작했습니다. 객체 직렬화에 문제가 없지만, 이제는 POJO가없는 XML에 요소를 삽입하고 싶습니다.JAXB로 요소를 스텁하는 간단한 방법은 무엇입니까?

예를 들어 Folder의 목록이 있으며 FolderFolders이라는 XML 요소에 넣을 수 있습니다. 이게 말이 돼? 적절한 경우 출력 스트림에 <Folders></Folders>을 쓸 수 있지만 좀 더 공식적인 방식으로이 작업을 수행하고 싶습니다.

답변

1

StAX와 함께 JAXB를 사용할 수 있습니다. XMLStreamWriter를 사용하면 XML과의 상호 작용을 공식화 및 인코딩 등이 이상 더 나은 제어를 제공하는 데 도움이됩니다

package forum8406266; 

import java.util.ArrayList; 
import java.util.List; 

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 { 
     JAXBContext jc = JAXBContext.newInstance(Folder.class); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); 

     List<Folder> folders = new ArrayList<Folder>(3); 
     folders.add(new Folder()); 
     folders.add(new Folder()); 
     folders.add(new Folder()); 

     XMLOutputFactory xof = XMLOutputFactory.newFactory(); 
     XMLStreamWriter xsw = xof.createXMLStreamWriter(System.out); 
     xsw.writeStartDocument(); 
     xsw.writeStartElement("Folders"); 

     for(Folder folder : folders) { 
      marshaller.marshal(folder, xsw); 
     } 

     xsw.writeEndElement(); 
     xsw.writeEndDocument(); 
     xsw.flush(); 
    } 

} 

위의 코드는 Folder 클래스가 @XmlRootElement의 주석을 붙일 수 있다고 가정합니다

package forum8406266; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="Folder") 
public class Folder { 

} 
+0

이 작품을 음, 고마워. 나는 마샬 (marshal)을 호출 할 때마다 불필요한''을 얻는다. 그러나 이것은 아마도 다른 문제 일 것이다. –

+1

Marshaller에서 JAXB_FRAGMENT 특성을 설정해야합니다. –

관련 문제