Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro "documento invalido" ao executar o programa

Olá, bom, eu estou tendo um erro ao executar o programa e até agora não consegui encontrar a causa. (Essa duvida é referente ao primeiro video da aula 2)

Classe Sistema.java

package br.com.synahoc.Teste;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import br.com.synahoc.model.Produto;

public class Sistema {
    public static void main(String[] args) throws Exception {

        DocumentBuilderFactory fabrica = DocumentBuilderFactory.newInstance();
        fabrica.setValidating(true);
        fabrica.setNamespaceAware(true);
        fabrica.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
                "http://www.w3.org/2001/XMLSchema\" targetNamespace=\"http://www.example.org/formatoVenda\" xmlns:tns=\"http://www.example.org/formatoVenda\" elementFormDefault=\"qualified");
        DocumentBuilder builder = fabrica.newDocumentBuilder();

        Document documento = builder.parse("src/Vendas.xml");

        Element venda = documento.getDocumentElement();
        String moeda = venda.getAttribute("moeda");
        System.out.println(moeda);

        NodeList produtos = documento.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);
        }

    }
}

Vendas.xml

<?xml version="1.0" encoding="UTF-8"?>
    <venda moeda="Real"
        xsi:noNamespaceSchemaLocation="formatoVenda.xsd"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <formaDePagamento>Cartão</formaDePagamento>
    </venda>



<!-- <venda>
    <Produtos>
        <produto>
            <nome>Livro de xml</nome>
            <preco>29.90</preco>
        </produto>
        <produto>
            <nome>Livro de Bacon</nome>
            <preco>29.90</preco>
        </produto>
    </Produtos>

</venda>
 -->

formatoVenda.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/formatoVenda" xmlns:tns="http://www.example.org/formatoVenda" elementFormDefault="qualified">

    <element name="venda">
        <complexType>
                <sequence>
                    <element name="formaDePagamento" type="string"></element>
                </sequence>
            <attribute
                name="moeda" type="string">    
            </attribute>
        </complexType>    
    </element>

    <element name="formaDePagamento" type="string"/>

</schema>

Erro:

Advertência: A validação foi ativada, mas um org.xml.sax.ErrorHandler não foi definido, provavelmente porque não era necessário. O parser usará um ErrorHandler padrão para imprimir os primeiros 0 erros. Chame o método 'setErrorHandler' para corrigir o problema.
Error: URI=file:///C:/Users/paulo/eclipse-workspace/XML/src/Vendas.xml Line=2: O documento é inválido: nenhuma gramática encontrada.
Error: URI=file:///C:/Users/paulo/eclipse-workspace/XML/src/Vendas.xml Line=2: O elemento-raiz do documento "venda" deve corresponder à raiz de DOCTYPE "null".

Se alguém puder me ajudar, fico grato.

1 resposta
solução!

Olá, Paulo!

No XSD, você precisa deixar apenas o namespace.

Então, ao invés de

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/formatoVenda" xmlns:tns="http://www.example.org/formatoVenda" elementFormDefault="qualified">

deve ser apenas

<schema xmlns="http://www.w3.org/2001/XMLSchema">