Eenvoudige manier om een ​​element te stomperen met JAXB?

Ik begin net te leren om JAXB te gebruiken om mijn Java-objecten in xml te rangschikken. Ik heb geen probleem serialisatie van objecten, maar nu wil ik een element in de xml invoegen waarvoor geen overeenkomstige POJO bestaat.

For example, I have a list of Folders, and I want to put each Folder into an xml element called Folders. Does this make sense? I could just write and to the output stream where appropriate, but I'd like to do this in a more formal way.

1

1 antwoord

Je zou JAXB met StAX kunnen gebruiken om dit te doen. Het gebruik van een XMLStreamWriter helpt om de interactie met de xml te formaliseren en geeft u betere controle over bijvoorbeeld de coderingen:

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 folders = new ArrayList(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();
    }

}

De bovenstaande code gaat ervan uit dat uw map -klasse is geannoteerd met @XmlRootElement :

package forum8406266;

import javax.xml.bind.annotation.XmlRootElement;

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

}
1
toegevoegd
Dit werkt goed, dank je. Ik krijg een externe <? xml versie = "1.0"?> bij elke aanroep van marshal , maar dit is waarschijnlijk een ander probleem.
toegevoegd de auteur Riley Lark, de bron
U moet ervoor zorgen dat u de eigenschap JAXB_FRAGMENT op de Marshaller instelt.
toegevoegd de auteur Blaise Doughan, de bron