Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Não recebo erro de "invalid content" recebo apenas "NullPointerException"

Durante a aula eu vi que meu código não estava de acordo ao vídeo, busquei nas aulas a frente e copiei tudo para ter certeza que não era erro de nomenclatura.

Quando eu rodo o programa ao inves de acusar da tag errada errado "nomes" ele acusa "NullPointerException" e se eu tiro os elementos de produto ele imprime produto ao invés de não aparecer nada.

o que eu estou fazendo de errado?

public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        factory.setValidating(true);
        factory.setNamespaceAware(true);
        factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
                "http://www.w3.org/2001/XMLSchema");

        Document document = builder.parse("src/venda.xml");

        Element tagFormaDePagamento = (Element) document.getElementsByTagName("formaDePagamento").item(0);
        String formaDePagamento = tagFormaDePagamento.getTextContent();

        System.out.println(formaDePagamento);
        String moeda = document.getDocumentElement().getAttribute("moeda");
        System.out.println(moeda);

        NodeList produtos = document.getElementsByTagName("produto");

        for (int i = 0; i < produtos.getLength(); i++) {
            Element produto = (Element) produtos.item(i);
            String nome = produto.getElementsByTagName("nome").item(0).getTextContent();
            Double preco = Double.parseDouble(produto.getElementsByTagName("preco").item(0).getTextContent());

            Produto prod = new Produto(nome, preco);



            System.out.println(prod);
        }

    }

formatoVenda.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="produto">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="nome" type="xsd:string" />
                <xsd:element name="preco" type="xsd:string" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="venda">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="formaDePagamento" type="xsd:string" />
                <xsd:element name="produtos">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element ref="produto" maxOccurs="unbounded" />
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="moeda" type="xsd:string" />
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

venda.xml

<?xml version="1.0" ?>
<venda moeda="real" xsi:noNamespaceSchemaLocation="formatoVenda.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <formaDePagamento>Cartao</formaDePagamento>
    <produtos>
        <produto>
            <nomes>Livro da casa do código</nomes>
            <preco>59.90</preco>
        </produto>
        <produto>
            <nome>Livro de java</nome>
            <preco>59.90</preco>
        </produto>
    </produtos>
</venda>
5 respostas

Opa, consegue colar para a gente a pilha de erro inteira? O npe deve referenciar uma linha na sua classe. Minha sugestão para adiantar o lado, é que você já tente ver essa linha para tentar achar a causa.

Se eu troco para "nomeS"

<produtos>
        <produto>
            <nomes>Livro da casa do código</nomes>
            <preco>59.90</preco>
        </produto>

dá o erro

Cartao
real
Exception in thread "main" java.lang.NullPointerException
    at br.com.alura.teste.sistema.main(sistema.java:36)

Linha 36

String nome = produto.getElementsByTagName("nome").item(0).getTextContent();

Não era para receber erro do xsd pedindo para corrigir para nome?

Tinha um erro no codigo estava "xmlns:xsd". Percebi isso na segunda parte da aula, mas mesmo assim não carrega o xsd.

<venda moeda="real" xsi:noNamespaceSchemaLocation="src/formatoVenda.xsd" xmlns:xsi="http://ww.w3.org/2001/XMLSchema-instance">

Na segunda parte da aula pede para usar o Sax para carregar o xml e se eu coloco "nomeS" ele apenas imprime "null"

[Nome:null
 Preço:55.9
, Nome:Livro de java
 Preço:37.9
]

Já tentei colocar "src/formatoVenda.xsd" ou s em "src/" assim como renomear o xsd para copiar o nome do arquivo para não ter chance de estar com o nome errado.

opa, quando vc coloca "nomes" o método retorna null para "nome" e você tenta emendar outra invocação, por isso o npe. Acho que o xml só vai ser validado se você setar o schema na Factory, ela tem um método chamado setSchema.

solução!

Terminei o curso quase agora e no ultimo tópico ele tem o código fonte dos exercícios passados. Eu rodei o código fonte e ele me acusa o erro em "nomeS".

Comparei linha por linha e o problema é a ordem dos "set's"

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        factory.setValidating(true);
        factory.setNamespaceAware(true);
        factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
                "http://www.w3.org/2001/XMLSchema");

Depois

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);
        factory.setNamespaceAware(true);        
        factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");   

        DocumentBuilder builder = factory.newDocumentBuilder();

Eu criei o builder antes de settar a factory.

Eu sempre caio nesses erros simples. Para mim eles são sempre difíceis de descobrir.

Muito obrigado Alberto , pela ajuda e atenção! :)