2011-12-06 13 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'の呼び出しごとに無関係な' <?xml version = "1.0"?> 'が出ますが、これはおそらく別の問題です。 –

+1

MarshallerでJAXB_FRAGMENTプロパティを設定する必要があります。 –

関連する問題