XML a partir do Java[QUASE RESOLVIDO]

14 respostas
guisantogui

Estou usando JAXB

Primeiramente, alguém ja gerou XML a partir do Java?

Alguém tem algum exemplo de uma classe que faça isso?

Sites de indicação!?

Toda ajuda é bem vinda MESMO!

OBS.: Eu tenho que usar o JAXB nada de JDOM por causa do XSD

14 Respostas

romarcio

Muito bom o xstream
http://xstream.codehaus.org/

luiz_renato

Bom ,

O pessoal usa muito o XStream - como já foi comentado. Eu trabalhei num projeto da NFe usei o JAXB e apesar de alguns problemas e limitações que tivemos que contornar funcionou legal. Gostei da forma de geração de beans a partir do XSD

Um artigo básico http://blog.caelum.com.br/jaxb-xml-e-java-de-maos-dadas/ , a partir daí dá uma “googloeada” que vc acha muita coisa.

guisantogui

cara eu vi no tutorial >> http://blog.caelum.com.br/jaxb-xml-e-java-de-maos-dadas/

o metodo "ObjectFactory().createCarro(carro);"

Como eu faço essa personalização do método?

Tipo eu procurei esse método e não existe na Lib original!

kiq095

aqui tem um metodo simples que forma um String e salva em um arquivo XML
da uma olhada ai e adapita ao seu jeito...

String URL="c:/test.xml"; 



public boolean Salvar(String URL){

        boolean test=false;
        String XML="";

        try{
            XStream xstream = new XStream();
// recebe uma classe e trasforma ela pro formato em XMl
                Classe  xml=new Classe();// calsse simples so com get e set 
                xml.setString_Classe(URL);//metodo set da classe simples 
               

                List string_XMl = new ArrayList(1);
                string_XMl.add(xml); // forma uma lista com uma string ja no formato do xml 

// salva classe transformada em xml no endereço especifico

                XML=xstream.toXML(string_XMl);
                BufferedWriter bw = new BufferedWriter(new FileWriter(file));
                bw.write(XML);
                bw.flush();
                bw.close();

                test=true;
        }
        catch(Exception ex){

            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "ERRO AO SALAVAR AS URL \n\r "+ex.toString(),"ERRO  12",JOptionPane.ERROR_MESSAGE);
            test=false;
}


        return test;
    }

qualquer coisa tenho um metodo pra ler tambem ou qualquer duvida ou erro posta ai... vo ajudar no que puder ..!

luiz_renato

guisantogui,

Quando vc gera as classes a partir do xsd pelo comando xjc, ele cria um ObjectFactory no mesmo pacote dos beans com métodos createSuaClasse(SuaClasse objeto) que vc pode personalizar.
Como te falei antes se o seu projeto não for obrigatório usar JAXB, parte algo mais simples como o colega indicou o XStream.

guisantogui

Mas com o XStream eu consigo definir o XSD???

kiq095

o XStream gera o arquivo xml de acordo com a sua classe simples , com os metodos q existem nela ,etc...

e so vc configurar isso .. da uma olhada e montar uma classe que te atendera ...
pelo menos eu faço assim ...

por ex:

public class Test{

private String Nome=" KIQ095";

    public String  getNome() {
        return Nome;
    }

    public void setCampos(String Nome) {
        this.Nome = Nome;
    }

essa classe gera um arquivo XML mais ou menos assim ..

<List>
    <Test>
      <Nome> KIQ095 </Nome>
    </Test>
</List>

tem com fazer classes com list com vetores .. com tudo cada uma forma um Xml diferente ai vc olha o q melhor te atende e configura os dados que a classe esta recebendo , o formato como serão salvos ...etc

guisantogui

cara acho que vou ter que usar o JAXB mesmo o Xstream não tem o esquema do XSD :confused:

luiz_renato

Olha só,

Tem o XMLBeans que gera beans através do XSD , dá uma olhada em http://robsonp.com/01/2011/xml-com-xmlbeans/ .

Andre_Fonseca

existe um programinha dentro do jdk para gerar o XSD atraves das classes java, chama-se schemagen, fica dentro do diretório bin

basta as tuas classes estarem mapeadas e rodar ele

abs

edit: http://download.oracle.com/javase/6/docs/technotes/tools/share/schemagen.html

guisantogui

galera acho que vou continuar no JAXB afinal já comecei com ele e não tenho tempo de começar do zero de outra tecnologia, então se souberem e puderem me esclarecer como o JAXB trabalha seria interessante! :wink:

vlw

guisantogui

executei o seguinte código:

public static void main(String[] args) throws JAXBException, FileNotFoundException{

        Cliente cliente = new Cliente("pedro", "rua", "78945612", Calendar.getInstance());

        JAXBContext jaxbContext = JAXBContext.newInstance("Cliente");

        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(jaxbContext, System.out);

que encontrei nesse tutorial: [url]http://www.devmedia.com.br/post-11547-Introducao-a-JAXB-2.html[/url]

e retornou essa excessão, estou tentando resolver aqui, se alguém souber o que é de cara a ajuda é bem vinda!

Exception in thread "main" javax.xml.bind.JAXBException: "Cliente" doesnt contain ObjectFactory.class or jaxb.index
        at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:197)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:127)
        at javax.xml.bind.ContextFinder.find(ContextFinder.java:276)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:412)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:375)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:279)
        at NFE.ExportarNotaFiscal.main(ExportarNotaFiscal.java:25)
guisantogui

tentei tb com esse código e gerou a mesma excessão acima!

@XmlRootElement(name="Nfe", namespace="http://www.portalfiscal.inf.br/nfe")
public class ExportarNotaFiscal {

    public static void main(String[] args) throws JAXBException, FileNotFoundException{
        Cliente cliente = new Cliente("pedro", "rua", "78945612", Calendar.getInstance());

        JAXBContext jaxbContext = JAXBContext.newInstance("Cliente");

        File f = new File("file.xml");
        Marshaller m = jaxbContext.createMarshaller();
        m.marshal(cliente, new FileOutputStream(f));


Exception in thread "main" javax.xml.bind.JAXBException: "Cliente" doesnt contain ObjectFactory.class or jaxb.index
        at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:197)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:127)
        at javax.xml.bind.ContextFinder.find(ContextFinder.java:276)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:412)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:375)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:279)
        at model.ExportarNotaFiscal.main(ExportarNotaFiscal.java:25)
guisantogui

CONSEGUIIII!!!! MERDA!!!!! :D

Só qro solucionar mais um bugzinho.

segue o print:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:teste xmlns:ns2="br.inf.portalfiscal.nfe">
    <id>0</id>
    <cpf>[telefone removido]</cpf>
    <cnpj>789789798798</cnpj>
    <nome>Gui</nome>
    <endereco>Rua</endereco>
    <telefone>12345678</telefone>
    <data>2011-03-28T17:45:19.124-03:00</data>
</ns2:teste>

eu qria tirar aquele "ns2:" da frente do troço, da pra fazer, alguém sabe como?

Segue o código que gera o XML:

public static void main(String[] args) throws JAXBException, FileNotFoundException{
        Cliente ex = new Cliente();
        ex.setNome("Gui");
        ex.setEndereco("Rua");
        ex.setData(Calendar.getInstance());
        ex.setId(0);
        ex.setTelefone("12345678");
        ex.setCnpj("789789798798");
        ex.setCpf("[telefone removido]");

        // Get a JAXB Context for the object we created above
        JAXBContext context = JAXBContext.newInstance(ex.getClass());

        // To convert ex to XML, I need a JAXB Marshaller
        Marshaller marshaller = context.createMarshaller();

        // Make the output pretty
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter sw = new StringWriter();

        // marshall the object to XML
        File f = new File("C:\Users\Guilherme\Documents\marshal.xml");
        marshaller.marshal(ex, sw);
        marshaller.marshal(ex, new FileOutputStream(f));
        System.out.println(sw.toString());
Criado 27 de março de 2011
Ultima resposta 28 de mar. de 2011
Respostas 14
Participantes 5