Marshalling XML JAXB

Pessoal,

No forum tem trocentos post sobre JAXB, XML, Marshalling, Validação, Schema.

Deve ser muito fácil pois ninguém diz como criar um XML a partir disso tudo.
Nao to falando de pegar um XML, ler e usá-lo validando.
To falando de criar um novo usando as classes geradas pelo JAXB.

Como se começa um novo XML que seguirá um xsd???

Tentei por exemplo assim:

JAXBElement<Carro> element = ObjectFactory().getCarro(); //algo assim

Mas diz que precisa de um JAXBElement e tá vindo um Carro , somente.

Alguém tem idéia se tem mudar o factory, ou se tem de fazer um casting?

Em outro posto achei um código extenso:


private void exportToXML(Collection col, String xsdFileName, String xmlFileName) {
        try {
            
            JAXBContext context = JAXBContext.newInstance("br.com.kyros.resolucao447.rbr");
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFileName));

            Marshaller marsh = context.createMarshaller();
            marsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, new Boolean(true));
            marsh.setEventHandler(new ValidationEventHandler() {
                // allow unmarshalling to continue even if there are errors   

                public boolean handleEvent(ValidationEvent ve) {
                    // ignore warnings   
                    if (ve.getSeverity() != ValidationEvent.WARNING) {
                        ValidationEventLocator vel = ve.getLocator();
                        System.out.println("Line:Col[" + vel.getLineNumber()
                                + ":" + vel.getColumnNumber()
                                + "]:" + ve.getMessage());
                    }
                    return false;
                }
            });
            marsh.setSchema(schema);
            marsh.marshal(col.iterator().next(), new FileOutputStream("c:\\" + xmlFileName));
            
        } catch (JAXBException jaxbe) {
            jaxbe.printStackTrace();
        } catch (SAXException saxe) {
            saxe.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

Mas não diz o que tem nessa Collection que vem como parâmetro. Alguém tem idéia do que seja?

Desde já agradeço. Tá muito dificil de encontrar algo consistente que abranja tudo isso de XML.

Cada post tem um pedaço incompleto e quase ninguém volta, depois que achou o problema, para postar a solução.

Acho que este tutorial é exatamente o que vc procura
http://www.vogella.de/articles/JAXB/article.html

[]'s

[quote=thiagocg]Acho que este tutorial é exatamente o que vc procura
http://www.vogella.de/articles/JAXB/article.html

[]'s[/quote]

Valeu thiagocg, perfeito, era exatamente o que eu precisava. Um tutorial simples,
com a criação de um XML do início ao fim.

Muito obrigado.

Mas ainda quero entender como se usa o tal do Factory.

Só lembrando: O JAXB cria as classes e o ObjectFactory junto.

daí Usando o código assim:

JAXBElement elem = ObjectFactory().getCarro();
ele retorna um objeto “Carro” e o compilador quer um JAXBElement

Então quero saber se preciso fazer algum casting, ou se tem que mudar o código fonte do ObjectFactory.

Trecho de codigo que escreve um XML no console. (Vc ja deve ter o seu content model gerado pelo JAXB no pacote com.company.integrate.integrateinvoicebpel)


ObjectFactory of = new ObjectFactory();
Stuff stuff = of.createStuff();

JAXBContext jaxbContext = JAXBContext.newInstance("com.company.integrate.integrateinvoicebpel");
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal( stuff, System.out );

Espero que ajude.