Ler XML via SAX[RESOLVIDO]

3 respostas
T

Olá, estou com o seguinte erro ao ler XML utilizando SAX.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.XMLReaderFactory;
public class LerXmlSAX{
        private XMLReader reader;
        XMLReader xmlR;
     public LerXmlSAX() throws SAXException, FileNotFoundException, IOException {
        System.out.println("\ninst. LerXmlSax()\n");
        
        xmlR = XMLReaderFactory.createXMLReader();
        ProdutoHandle pH = new ProdutoHandle();
        xmlR.setContentHandler(pH);
        
        InputStream is = new FileInputStream("src/main/java/venda.xml");
        InputSource arquivo = new InputSource(is);
        xmlR.parse(arquivo);
     }
}

Classe q extende Defaulthandle

import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ProdutoHandle  extends DefaultHandler{
            private List<Produto> produtos = new ArrayList<>();
            private Produto produto;
            private StringBuilder conteudoAtual ;
    public List<Produto> getProdutos() {
        return produtos;
    }

    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("\nLendo:"+qName);        
        
        if(qName.equalsIgnoreCase("produto")){
        produto = new Produto();
       }
        
        conteudoAtual = new StringBuilder();
        
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
       if(!(ch.length == 0)){
       conteudoAtual.append(new String(ch , start, length));
       }else{
           conteudoAtual = null;
       }
    
        
    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
      System.out.println("END ELEMENT");
       if(qName.equalsIgnoreCase("produto")){
           produtos.add(this.produto);
       }if(qName.equalsIgnoreCase("nome")){
           produtos.get(produtos.size()-1).setNome(conteudoAtual.toString());
        }if(qName.equalsIgnoreCase("preco")){
            produtos.get(produtos.size()-1).setPreco(Double.parseDouble(conteudoAtual.toString()));
        }
    }
    
     @Override
    public void endDocument() throws SAXException {
        System.out.println("END DOCMENT");
      
       
    }

documento venda XML;

<venda moeda="R$" 
       xsd:noNamespaceSchemaLocation="formatoVenda.xsd" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">
    
    <formaDePagamento>Cartao</formaDePagamento>
    <produto>
        <nome>Livro de XML</nome>
        <preco>22.00</preco>
    </produto>
     <produto>
        <nome>Livro Java O.O</nome>
        <preco>122.00</preco>
    </produto>
     <produto>
        <nome>Livro de AJAX</nome>
        <preco>29.00</preco>
    </produto>
     <produto>
        <nome>Livro de Ruby</nome>
        <preco>42.00</preco>
    </produto>
</venda>

Quando executo new LerXmlSax() segue o seguinte errro.

INSTANCIA DE LERXMLSAX========


Lendo:venda

Lendo:formaDePagamento
END ELEMENT

Lendo:produto
Exception in thread "main" java.lang.UnsupportedOperationException: Not supported yet.
	at br.com.alura.teste.Produto.<init>(Produto.java:14)
	at br.com.alura.teste.ProdutoHandle.startElement(ProdutoHandle.java:26)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:380)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2787)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
	at br.com.alura.teste.LerXmlSAX.<init>(LerXmlSAX.java:24)
	at br.com.alura.teste.Driver.main(Driver.java:8)
------------------------------------------------------------------------
BUILD FAILURE

3 Respostas

T

Pelo que entendi o erro está na comparação do qName com a String “produto” no método startElement()…
ja tentei fazer utilizando equals, equalsIgnoreCase, compareTo == 0, até memso == e nenhum dele resolveu.

Caso encontre a solução posto aqui

C

Boa tarde,

Veja se esse tutorial lhe ajuda. Em comparação com o seu codigo, falta alguns metados.

T

resolvido

package br.com.alura.teste;

import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ProdutoHandle  extends DefaultHandler{
            private final List<Produto> produtos = new ArrayList<>();
            private Produto produto;
            private StringBuilder conteudoAtual ;
            private String tagAtual;
            private String idAtual;
            
            
    public List<Produto> getProdutos() {
        return produtos;
    }

    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      
        tagAtual = qName;
        if(tagAtual.equals("produto")){ 
            produto  = new Produto();
            idAtual = attributes.getValue(0);
        }if((tagAtual.compareTo("nome")==0)|| (tagAtual.compareTo("preco") == 0)) 
            conteudoAtual = new StringBuilder();
       
        
    }
    
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if((tagAtual.equals("nome"))|| (tagAtual.compareTo("preco") == 0)){
            conteudoAtual.append(new String(ch, start, length));
        }
        
    }
    
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
    
        if(qName.equals("produto")) {
             produtos.add(this.produto);
        }else if(qName.equalsIgnoreCase("nome")){
             produto.setNome(conteudoAtual.toString());
        }else if(qName.equalsIgnoreCase("preco")){
             produto.setPreco(Double.parseDouble(conteudoAtual.toString()));
        }
    tagAtual = "";
    }
    
    @Override
    public void endDocument() throws SAXException {
    
    
    
    }
    
    
 
    
    
    
}
Criado 8 de março de 2016
Ultima resposta 20 de abr. de 2016
Respostas 3
Participantes 2