Leitura de XML

Pessoal, preciso ler o xml da nfe, por enquanto estou conseguindo pegar os valores da tag “infNFe” mas não sei como fazer paga pegar os outros valores, o código que estou usando é esse:

[code] File f = new File(“c:/nfe.xml”);

SAXBuilder sb = new SAXBuilder();

Document d = sb.build(f);

Element nota = d.getRootElement();

List elements = nota.getChildren();

Iterator i = elements.iterator();

while (i.hasNext()) {
Element element = (Element) i.next();
System.out.println(“Versao:”+ element.getAttributeValue(“versao”));
System.out.println(“ID:”+ element.getAttributeValue(“Id”));
}[/code]

Luciano_Lopes,

fiz um artigo explicativo do uso do método SAX e sua vantagem em relação ao método DOM para leitura de XML.

O artigo está no link http://www.oracle2java.blogspot.com.br/2012/08/java-leitura-de-xml-com-sax.html.

Caso tenha dúvida após ler o artigo, torne a entrar em contato.

wiliamps

Da uma olhada no JaxB

http://www.mkyong.com/java/jaxb-hello-world-example/

http://pic.dhe.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Ftwbs_jaxbschema2java.html

[quote=wiliamps]Luciano_Lopes,

fiz um artigo explicativo do uso do método SAX e sua vantagem em relação ao método DOM para leitura de XML.

O artigo está no link http://www.oracle2java.blogspot.com.br/2012/08/java-leitura-de-xml-com-sax.html.

Caso tenha dúvida após ler o artigo, torne a entrar em contato.

wiliamps
http://oracle2java.blogspot.com/[/quote]

Estou tentando pegar o valor do ID mas ta vindo nulo:

[code]
SAXBuilder sb = new SAXBuilder();

    Document doc = sb.build(f);

    Element nota = doc.getRootElement();

    System.out.println("ID: " + nota.getAttributeValue("Id"));  [/code]

Poste o conteudo do seu XML para eu verificar.

<NFe xmlns="http://www.portalfiscal.inf.br/nfe"> <infNFe Id="NFe35110906062933000190550010000000441739698166" versao="2.00"> <ide> <cUF>35</cUF> <cNF>73969816</cNF> <natOp>VENDA DE MERCADORIA</natOp> <indPag>1</indPag> <mod>55</mod> <serie>1</serie> <nNF>44</nNF> <dEmi>2011-09-09</dEmi> <dSaiEnt>2011-09-09</dSaiEnt> <tpNF>1</tpNF> <cMunFG>3548708</cMunFG> <tpImp>1</tpImp> <tpEmis>1</tpEmis> <cDV>6</cDV> <tpAmb>2</tpAmb> <finNFe>1</finNFe> <procEmi>3</procEmi> <verPr

Seu XML está com problemas do fechamento das tags. Tem que fechar todas de maneira correta.

Olha só isso:

Devia ser assim:

wiliamps

Ele fecha la no final, oque postei foi só o começo da nota. Se quiser te mando a nota toda para você poder testar,me passa teu email.

Se necessário, entre em contato pelo blog.

wiliamps

Luciano_Lopes,

para registro da solução aqui no GUJ, segue um modelo resumido para leitura do XML enviado por você.

Você tem um XML parecido com uma árvore de diretórios, por isso é mais complexo fazer funcionar, mas você vai entender com isso:

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class TestaXML {

    public static void main(String[] args) throws JDOMException, IOException {

        File f = new File("c:/temp/NFE.xml");

        SAXBuilder sb = new SAXBuilder();

        Document doc = sb.build(f);
       
        Element nfe = doc.getRootElement();

        // Retorna lista com infNFE e Signature
        List<Element> elements = nfe.getChildren();

        // Acessa direto infNFE(get(0)).ide(get(0)).elementos(getChildren())
        List<Element> ide = elements.get(0).getChildren().get(0).getChildren();

        System.out.println("Imprime IDE:");
        for (int i = 0; i < ide.size(); i++) {
            Element ideElement = ide.get(i);
            System.out.println(ideElement.getName() + ": " + ideElement.getValue());
        }
           
        System.out.println("-------------------------------------------------");   

        // Acessa direto infNFE(get(0)).emit(get(1)).elementos(getChildren())
        List<Element> emit = elements.get(0).getChildren().get(1).getChildren();
       
        System.out.println("Imprime EMIT:");
        for (int i = 0; i < emit.size(); i++) {
            Element emitElement = emit.get(i);
            System.out.println(emitElement.getName() + ": " + emitElement.getValue());
        }
           
        System.out.println("-------------------------------------------------");   
       
    }   

}

wiliamps