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

Erro ao copilar, não pode localizar a declaração do elemento!

Ta dando esse erro aqui!

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 primeir os 0 erros. Chame o método 'setErrorHandler' para corrigir o problema. Error: URI=file:///E:/workspace_alura/Alura/java-xml/src/venda.xml Line=3: cvc-elt.1: Não pode localizar a declaração do elemento 'venda'.

Porém o elemente venda está sendo declarado no meu xml tando no meu xsd

segue os codigos

xml

<?xml version="1.0" ?>
<venda moeda="real" xsd:noNamespaceSchemaLocation="src/venda.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">
    <formaDePagamento>Cartao</formaDePagamento>
    <produtos>
        <prodsuto>
            <nome>Livro php</nome>
            <preco>59.90</preco>
        </prodsuto>
        <produto>
            <nome>Livro java</nome>
            <preco>59.90</preco>
        </produto>
        <produto>
            <nome>Livro código</nome>
            <preco>97.90</preco>
        </produto>
        <produto>
            <nome>Livro de sql</nome>
            <preco>94.90</preco>
        </produto>
    </produtos>
</venda>

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>

classe testa

package br.com.ciroxml.teste;

import java.io.IOException;
import java.math.BigDecimal;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TesteAppXml {

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

        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();

        Document document = builder.parse("src/venda.xml");
        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();
            String valor = produto.getElementsByTagName("preco").item(0).getTextContent();

            System.out.println("-----------");
            System.out.println("Nome do produto: " + nome);
            System.out.println("Preco do produto: " + valor);
            System.out.println("-----------");
        }
    }

}
2 respostas
solução!

Oi Ciro,

o arquivo XSD está na pasta src?

abs, nico

Opa nico, era exatamente isso que você falou, obrigado!